若转载教程,请注明出自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.管理上的难度
假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦。反而简单工厂没有这些麻烦,当多个产品类需要修改是,简单工厂模式仍然仅仅需要修改唯一的工厂类。