<?php/**1* 设计模式之简单工厂模式* 小黄牛*/header("Content-type: text/html; charset=utf-8");/*** 接口 - 技能设定*/interface IProduct{public function Attack(); // 攻击public function Defense(); // 防御}/*** 创建 - 步兵*/class XPinfantry implements IProduct{public function Attack() { echo '步兵进攻,攻击力:10~ <br/>';}public function Defense(){ echo '步兵防守,防御力:20~ <br/>';}}/*** 创建 - 骑兵*/class XPcavalry implements IProduct{public function Attack() { echo '骑兵进攻,攻击力:30~ <br/>';}public function Defense(){ echo '骑兵防守,防御力:5~ <br/>';}}/*** 工厂角色*/class ProductFactory{public static function GetInstance($style){switch ($style){case 1: // 创建步兵return new XPinfantry();break;case 2: // 创建骑兵return new XPcavalry();break;default:return null;}}}$obj = array();$obj[] = ProductFactory::GetInstance(1); // 生产一个步兵$obj[] = ProductFactory::GetInstance(2); // 生产一个骑兵$obj[] = ProductFactory::GetInstance(3); // 生产错了$obj[] = ProductFactory::GetInstance(2); // 生产一个骑兵foreach ($obj as $val) {if ($val) {$val->Attack(); // 进攻$val->Defense(); // 防守} else {echo '暂无该类兵种!<br/>';}}
浏览器输出1
步兵进攻,攻击力:10~步兵防守,防御力:20~骑兵进攻,攻击力:30~骑兵防守,防御力:5~暂无该类兵种!骑兵进攻,攻击力:30~骑兵防守,防御力:5~
简单工厂模式
工厂(SimpleFactory)角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。抽象产品(IProduct)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。具体产品(Concrete Product)角色:是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。需求:根据提供相应的属性值由简单工厂创建具有相应特性的产品对象。
优点
让对象的调用者和对象创建过程分离,当对象调用者需要对象时,直接向工厂请求即可。从而避免了对象的调用者与对象的实现类以硬编码方式耦合,以提高系统的可维护性、可扩展性。
缺点
当产品修改时,工厂类也要做相应的修改,比如要增加一种操作方法,如冲锋技能,就得修改原有类,违背了开放-封闭原则
