若转载教程,请注明出自SW-X框架官方文档1
<?php/*** 设计模式之工厂方法模式* 小黄牛*/header("Content-type: text/html; charset=utf-8");/*** 接口 - 士兵*/interface IProduct{public function Attack(); // 攻击}/*** 创建 - 步兵*/class XPinfantry implements IProduct{public function Attack() { echo '步兵进攻,攻击力:10~ <br/>';}}/*** 创建 - 骑兵*/class XPcavalry implements IProduct{public function Attack() { echo '骑兵进攻,攻击力:30~ <br/>';}}/*** 接口 - 工厂*/interface IServerFactory{public function GetInstance();}/*** 创建 - 步兵工厂*/class ProductInfantry implements IServerFactory{public function GetInstance(){ return new XPinfantry();}}/*** 创建 - 骑兵工厂*/class ProductCavalry implements IServerFactory{public function GetInstance(){ return new XPCavalry ();}}$Infantry = new ProductInfantry(); // 建立步兵工厂$Cavalry = new ProductCavalry(); // 建立骑兵工厂$obj = array();$obj[] = $Infantry->GetInstance(); // 生产一个步兵$obj[] = $Cavalry ->GetInstance(); // 生产一个骑兵$obj[] = $Cavalry ->GetInstance(); // 生产一个骑兵foreach ($obj as $val) {$val->Attack(); // 进攻}
浏览器输出
步兵进攻,攻击力:10~骑兵进攻,攻击力:30~骑兵进攻,攻击力:30~
工厂模式
抽象工厂角色(IServerFactory):是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。具体工厂角色(ChickenLegBaoFactory):这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。抽象产品角色(IHanbao):工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。具体产品角色(ChickenLegBao):这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
优点
克服了简单工厂模式违背开放-封闭的原则,保持了封装对象创建过程的优点。
缺点
增加产品时,就得增加一个产品工厂的类,增加额外的开发量。避免不了分支判断的问题。
与简单工厂模式的比较
1. 结构复杂度简单工厂模式要占优。简单工厂模式只需一个工厂类,而工厂方法模式的工厂类随着产品类个数增加而增加,从而增加了结构的复杂程度。2.代码复杂度代码复杂度和结构复杂度是一对矛盾,既然简单工厂模式在结构方面相对简洁,那么它在代码方面肯定是比工厂方法模式复杂的了。简单工厂模式的工厂类随着产品类的增加需要增加很多方法(或代码),而工厂方法模式每个具体工厂类只完成单一任务,代码简洁。3.管理上的难度假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦。反而简单工厂没有这些麻烦,当多个产品类需要修改是,简单工厂模式仍然仅仅需要修改唯一的工厂类。
