• 我们中的有些人,注定要在日常生活的点滴中去寻找生命的意义。---- 《生活大爆炸》|

简单工厂

创建型模式 admin 3年前 (2017-06-21) 683次浏览 已收录 0个评论

【转】小黄牛 — 简单工厂

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

浏览器输出

步兵进攻,攻击力:10~
步兵防守,防御力:20~
骑兵进攻,攻击力:30~
骑兵防守,防御力:5~
暂无该类兵种!
骑兵进攻,攻击力:30~
骑兵防守,防御力:5~

 

简单工厂模式

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

优点

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

缺点

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

 

 


本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:简单工厂
喜欢 (0)

您必须 登录 才能发表评论!