工厂模式之PHP实现

来源:互联网 发布:350装修软件下载 编辑:程序博客网 时间:2024/05/01 05:46
  1. <?php
  2. /** 
  3.  * @name: 设计模式--工厂模式
  4.  * ============================================================================ 
  5.  * 意图:
  6.  * 提供一个创建一系列相关或依赖对象的接口,而无需指定他们具体的类。
  7.  * 适用性:
  8.  * 1、一个系统要独立于它的产品的创建、组合和表示时
  9.  * 2、一个系统要由多个产品系列中的一个来配置时。
  10.  * 3、当你要强调一系列相关产品对象的设计以便进行联合使用时。
  11.  * 4、当你提供一个产品类库,而只想显示它们的接口而不是实现时。
  12.  * ============================================================================ 
  13.  * @copyright: http://blog.csdn.net/wkjs 
  14.  * @author: 王康 
  15. */ 
  16. ?>
  17. <?php
  18. /** 
  19.  * @name: 设计模式--工厂模式
  20.  * ============================================================================ 
  21.  * 被吃对象抽象类      
  22.  * ============================================================================ 
  23.  * @copyright: http://blog.csdn.net/wkjs 
  24.  * @author: 王康 
  25. */ 
  26. abstract class Herbivore {
  27.     
  28.     /**
  29.      * 抽象类对象名称
  30.      *
  31.      * @return string 被吃对象名称
  32.      *
  33.      */
  34.     public abstract function className();
  35. }
  36. ?>
  37. <?php
  38. /** 
  39.  * @name: 设计模式--工厂模式
  40.  * ============================================================================ 
  41.  * 吃对象抽象类
  42.  * ============================================================================ 
  43.  * @copyright: http://blog.csdn.net/wkjs 
  44.  * @author: 王康 
  45. */ 
  46. abstract class Carnivore {
  47.     
  48.     /**
  49.      * 抽象类对象名称
  50.      *
  51.      * @return string 对象名称
  52.      *
  53.      */
  54.     public abstract function className();
  55.     
  56.     /**
  57.      * 显示食物链
  58.      *
  59.      * @param Herbivore $h 被吃对象实例
  60.      * @return void void
  61.      *
  62.      */
  63.     public abstract function Eat($h);
  64. }
  65. ?>
  66. <?php
  67. /** 
  68.  * @name: 设计模式--工厂模式
  69.  * ============================================================================ 
  70.  * 角马类实现
  71.  * ============================================================================ 
  72.  * @copyright: http://blog.csdn.net/wkjs 
  73.  * @author: 王康 
  74. */ 
  75. class Wildebeest extends Herbivore {
  76.     public function className() {
  77.         return '角马';
  78.     }
  79. }
  80. ?>
  81. <?php
  82. /** 
  83.  * @name: 设计模式--工厂模式
  84.  * ============================================================================ 
  85.  * 狮子类实现
  86.  * ============================================================================ 
  87.  * @copyright: http://blog.csdn.net/wkjs 
  88.  * @author: 王康 
  89. */ 
  90. class Lion extends Carnivore {
  91.     public function className() {
  92.         return '狮子';
  93.     }
  94.     public function Eat($h) {
  95.         echo $this->className().'吃'.$h->className().'<br />';
  96.     }
  97. }
  98. ?>
  99. <?php
  100. /** 
  101.  * @name: 设计模式--工厂模式
  102.  * ============================================================================ 
  103.  * 北美犀牛类实现 
  104.  * ============================================================================ 
  105.  * @copyright: http://blog.csdn.net/wkjs 
  106.  * @author: 王康 
  107. */ 
  108. class Bison extends Herbivore {
  109.     public function className() {
  110.         return '北美犀牛';
  111.     }
  112. }
  113. ?>
  114. <?php
  115. /** 
  116.  * @name: 设计模式--工厂模式
  117.  * ============================================================================ 
  118.  * 狼类实现 
  119.  * ============================================================================ 
  120.  * @copyright: http://blog.csdn.net/wkjs 
  121.  * @author: 王康 
  122. */ 
  123. class Wolf extends Carnivore {
  124.     public function className() {
  125.         return '狼';
  126.     }
  127.     public function Eat($h) {
  128.         echo $this->className().'吃'.$h->className().'<br />';
  129.     }
  130. }
  131. ?>
  132. <?php
  133. /** 
  134.  * @name: 设计模式--工厂模式
  135.  * ============================================================================ 
  136.  * 大陆抽象类
  137.  * ============================================================================ 
  138.  * @copyright: http://blog.csdn.net/wkjs 
  139.  * @author: 王康 
  140. */ 
  141. abstract class ContinentFactory {
  142.     
  143.     /**
  144.      * 创建被吃函数
  145.      *
  146.      * @return Herbivore 被吃对象实例
  147.      *
  148.      */
  149.     public abstract function CreateHerbivore();
  150.     
  151.     /**
  152.      * 创建吃函数
  153.      *
  154.      * @return Carnivore 吃对象实例
  155.      *
  156.      */
  157.     public abstract function CreateCarnivore();
  158. }
  159. ?>
  160. <?php
  161. /** 
  162.  * @name: 设计模式--工厂模式
  163.  * ============================================================================ 
  164.  * 非洲大陆食物链类
  165.  * ============================================================================ 
  166.  * @copyright: http://blog.csdn.net/wkjs 
  167.  * @author: 王康 
  168. */ 
  169. class AfricaFactory extends ContinentFactory {
  170.     public function CreateHerbivore() {
  171.         return new Wildebeest();
  172.     }
  173.     public function CreateCarnivore() {
  174.         return new Lion();
  175.     }
  176. }
  177. ?>
  178. <?php
  179. /** 
  180.  * @name: 设计模式--工厂模式
  181.  * ============================================================================ 
  182.  * 美洲大陆食物链类
  183.  * ============================================================================ 
  184.  * @copyright: http://blog.csdn.net/wkjs 
  185.  * @author: 王康 
  186. */ 
  187. class AmericaFactory extends ContinentFactory {
  188.     public function CreateHerbivore() {
  189.         return new Bison();
  190.     }
  191.     public function CreateCarnivore() {
  192.         return new Wolf();
  193.     }
  194. }
  195. ?>
  196. <?php
  197. /** 
  198.  * @name: 设计模式--工厂模式
  199.  * ============================================================================ 
  200.  * 动物类
  201.  * ============================================================================ 
  202.  * @copyright: http://blog.csdn.net/wkjs 
  203.  * @author: 王康 
  204. */ 
  205. class AnimalWorld {
  206.     
  207.     /**
  208.      * 被吃对象
  209.      *
  210.      * @var Herbivore 
  211.      *
  212.      */
  213.     var $herbivore;
  214.     
  215.     /**
  216.      * 吃对象
  217.      *
  218.      * @var Carnivore 
  219.      *
  220.      */
  221.     var $carnivore;
  222.     
  223.     /**
  224.      * 构造函数
  225.      *
  226.      * @param ContinentFactory $factory 大陆类实例
  227.      * @return void void
  228.      *
  229.      */
  230.     function AnimalWorld($factory) {
  231.         $this->carnivore=$factory->CreateCarnivore();
  232.         $this->herbivore=$factory->CreateHerbivore();
  233.     }
  234.     
  235.     /**
  236.      * 显示食物链
  237.      *
  238.      * @return void void
  239.      *
  240.      */
  241.     function RunFoodChain() {
  242.         $this->carnivore->Eat($this->herbivore);
  243.     }
  244. }
  245. ?>
  246. <?php
  247. /** 
  248.  * @name: 设计模式--工厂模式
  249.  * ============================================================================ 
  250.  * 测试代码 
  251.  * ============================================================================ 
  252.  * @copyright: http://blog.csdn.net/wkjs 
  253.  * @author: 王康 
  254. */ 
  255. include_once 'class.Abstract.php';
  256. $africa=new AfricaFactory();
  257. $world=new AnimalWorld($africa);
  258. $world->RunFoodChain();
  259. $america=new AmericaFactory();
  260. $world=new AnimalWorld($america);
  261. $world->RunFoodChain();
  262. ?>
 
原创粉丝点击