若转载教程,请注明出自SW-X框架官方文档1

    1. <?php
    2. /**
    3. * 设计模式之工厂方法模式
    4. * 小黄牛
    5. */
    6. header("Content-type: text/html; charset=utf-8");
    7. /**
    8. * 接口 - 士兵
    9. */
    10. interface IProduct{
    11. public function Attack(); // 攻击
    12. }
    13. /**
    14. * 创建 - 步兵
    15. */
    16. class XPinfantry implements IProduct{
    17. public function Attack() { echo '步兵进攻,攻击力:10~ <br/>';}
    18. }
    19. /**
    20. * 创建 - 骑兵
    21. */
    22. class XPcavalry implements IProduct{
    23. public function Attack() { echo '骑兵进攻,攻击力:30~ <br/>';}
    24. }
    25. /**
    26. * 接口 - 工厂
    27. */
    28. interface IServerFactory{
    29. public function GetInstance();
    30. }
    31. /**
    32. * 创建 - 步兵工厂
    33. */
    34. class ProductInfantry implements IServerFactory{
    35. public function GetInstance(){ return new XPinfantry();}
    36. }
    37. /**
    38. * 创建 - 骑兵工厂
    39. */
    40. class ProductCavalry implements IServerFactory{
    41. public function GetInstance(){ return new XPCavalry ();}
    42. }
    43. $Infantry = new ProductInfantry(); // 建立步兵工厂
    44. $Cavalry = new ProductCavalry(); // 建立骑兵工厂
    45. $obj = array();
    46. $obj[] = $Infantry->GetInstance(); // 生产一个步兵
    47. $obj[] = $Cavalry ->GetInstance(); // 生产一个骑兵
    48. $obj[] = $Cavalry ->GetInstance(); // 生产一个骑兵
    49. foreach ($obj as $val) {
    50. $val->Attack(); // 进攻
    51. }

    浏览器输出

    1. 步兵进攻,攻击力:10~
    2. 骑兵进攻,攻击力:30~
    3. 骑兵进攻,攻击力:30~

    工厂模式

    1. 抽象工厂角色(IServerFactory):是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
    2. 具体工厂角色(ChickenLegBaoFactory):这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
    3. 抽象产品角色(IHanbao):工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
    4. 具体产品角色(ChickenLegBao):这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

    优点

    1. 克服了简单工厂模式违背开放-封闭的原则,保持了封装对象创建过程的优点。

    缺点

    1. 增加产品时,就得增加一个产品工厂的类,增加额外的开发量。避免不了分支判断的问题。

    与简单工厂模式的比较

    1. 1. 结构复杂度
    2. 简单工厂模式要占优。简单工厂模式只需一个工厂类,而工厂方法模式的工厂类随着产品类个数增加而增加,从而增加了结构的复杂程度。
    3. 2.代码复杂度
    4. 代码复杂度和结构复杂度是一对矛盾,既然简单工厂模式在结构方面相对简洁,那么它在代码方面肯定是比工厂方法模式复杂的了。简单工厂模式的工厂类随着产品类的增加需要增加很多方法(或代码),而工厂方法模式每个具体工厂类只完成单一任务,代码简洁。
    5. 3.管理上的难度
    6. 假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦。反而简单工厂没有这些麻烦,当多个产品类需要修改是,简单工厂模式仍然仅仅需要修改唯一的工厂类。