1. <?php
    2. /**1
    3. * 设计模式之简单工厂模式
    4. * 小黄牛
    5. */
    6. header("Content-type: text/html; charset=utf-8");
    7. /**
    8. * 接口 - 技能设定
    9. */
    10. interface IProduct{
    11. public function Attack(); // 攻击
    12. public function Defense(); // 防御
    13. }
    14. /**
    15. * 创建 - 步兵
    16. */
    17. class XPinfantry implements IProduct{
    18. public function Attack() { echo '步兵进攻,攻击力:10~ <br/>';}
    19. public function Defense(){ echo '步兵防守,防御力:20~ <br/>';}
    20. }
    21. /**
    22. * 创建 - 骑兵
    23. */
    24. class XPcavalry implements IProduct{
    25. public function Attack() { echo '骑兵进攻,攻击力:30~ <br/>';}
    26. public function Defense(){ echo '骑兵防守,防御力:5~ <br/>';}
    27. }
    28. /**
    29. * 工厂角色
    30. */
    31. class ProductFactory{
    32. public static function GetInstance($style){
    33. switch ($style){
    34. case 1: // 创建步兵
    35. return new XPinfantry();
    36. break;
    37. case 2: // 创建骑兵
    38. return new XPcavalry();
    39. break;
    40. default:
    41. return null;
    42. }
    43. }
    44. }
    45. $obj = array();
    46. $obj[] = ProductFactory::GetInstance(1); // 生产一个步兵
    47. $obj[] = ProductFactory::GetInstance(2); // 生产一个骑兵
    48. $obj[] = ProductFactory::GetInstance(3); // 生产错了
    49. $obj[] = ProductFactory::GetInstance(2); // 生产一个骑兵
    50. foreach ($obj as $val) {
    51. if ($val) {
    52. $val->Attack(); // 进攻
    53. $val->Defense(); // 防守
    54. } else {
    55. echo '暂无该类兵种!<br/>';
    56. }
    57. }

    浏览器输出1

    1. 步兵进攻,攻击力:10~
    2. 步兵防守,防御力:20~
    3. 骑兵进攻,攻击力:30~
    4. 骑兵防守,防御力:5~
    5. 暂无该类兵种!
    6. 骑兵进攻,攻击力:30~
    7. 骑兵防守,防御力:5~

    简单工厂模式

    1. 工厂(SimpleFactory)角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
    2. 抽象产品(IProduct)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
    3. 具体产品(Concrete Product)角色:是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
    4. 需求:根据提供相应的属性值由简单工厂创建具有相应特性的产品对象。

    优点

    1. 让对象的调用者和对象创建过程分离,当对象调用者需要对象时,直接向工厂请求即可。从而避免了对象的调用者与对象的实现类以硬编码方式耦合,以提高系统的可维护性、可扩展性。

    缺点

    1. 当产品修改时,工厂类也要做相应的修改,比如要增加一种操作方法,如冲锋技能,就得修改原有类,违背了开放-封闭原则