php 开发模式之工厂模式

 
  1. <?php

  2.  
 
  1. // 开发模式之工程模式

  2. // 工厂模式:

  3. // 由工厂类根据参数来决定创建出哪一种产品类的实例;

  4. // 工厂类是指包含了一个专门用来创建其他对象的方法的类。所谓按需分配,传入参数进行选择,返回具体的类。

  5. // 工厂模式的最主要作用就是对象创建的封装、简化创建对象操作。

  6. // 简单的说,就是调用工厂类的一个方法(传入参数)来得到需要的类;

  7.  
  8.  
  9. //示例1 最基本的工厂模式

  10.  
  11. class Myname{

  12. public function OutPutMyName(){

  13. return 'name is rongyouyuan!~';

  14. }

  15. }

  16. class NameFactory{

  17. public static function Namefunc(){

  18. return new Myname();

  19. }

  20. }

  21. $obj=NameFactory::Namefunc();

  22. echo $obj->OutPutMyName();

  23. ?>

上面是最最简单的工厂模式,下面使用工厂模式实现一个简单的计算器

 
  1. <?php

  2. //定义一个抽象类

  3. abstract class operation

  4. {

  5. protected $_numA = 0;

  6. protected $_numB = 0;

  7. protected $_result = 0;

  8. public function __construct($a, $b)

  9. {

  10. $this->_numA = $a;

  11. $this->_numB = $b;

  12. }

  13. //抽象方法所有子类必须实现该方法

  14. protected abstract function getResult();

  15. }

  16. //加法运算

  17. class operationAdd extends operation

  18. {

  19. public function getResult()

  20. {

  21. $this->_result = $this->_numA + $this->_numB;

  22. return $this->_result;

  23. }

  24. }

  25. //减法运算

  26. class operationSub extends operation

  27. {

  28. public function getResult()

  29. {

  30. $this->_result = $this->_numA - $this->_numB;

  31. return $this->_result;

  32. }

  33. }

  34. //乘法运算

  35. class operationMul extends operation

  36. {

  37. public function getResult()

  38. {

  39. $this->_result = $this->_numA * $this->_numB;

  40. return $this->_result;

  41. }

  42. }

  43. //除法运算

  44. class operationDiv extends operation

  45. {

  46. public function getResult()

  47. {

  48. $this->_result = $this->_numA / $this->_numB;

  49. return $this->_result;

  50. }

  51. }

  52. //定义工厂类

  53. class operationFactory

  54. {

  55. //创建保存示例的静态成员变量

  56. private static $obj;

  57. //创建实例的静态方法

  58. public static function CreateOperation($type, $a, $b)

  59. {

  60. switch ($type) {

  61. case '+':

  62. self::$obj = new operationAdd($a, $b);

  63. break;

  64. case '-':

  65. self::$obj = new operationSub($a, $b);

  66. break;

  67. case '*':

  68. self::$obj = new operationMul($a, $b);

  69. break;

  70. case '/':

  71. self::$obj = new operationDiv($a, $b);

  72. break;

  73. }

  74. //最后返回这个实例

  75. return self::$obj;

  76. }

  77. }

  78. //最后我们使用工厂模式

  79. $obj = operationFactory::CreateOperation('+', 100, 20);

  80. echo $obj->getResult();

最后 抽象工厂

以下内容转载自:http://blog.csdn.net/zhengzhb/article/details/7359385

定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

类型:创建类模式

类图:

抽象工厂模式与工厂方法模式的区别

        抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。

        在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。我们依然拿生产汽车的例子来说明他们之间的区别。

在上面的类图中,两厢车和三厢车称为两个不同的等级结构;而2.0排量车和2.4排量车则称为两个不同的产品族。再具体一点,2.0排量两厢车和2.4排量两厢车属于同一个等级结构,2.0排量三厢车和2.4排量三厢车属于另一个等级结构;而2.0排量两厢车和2.0排量三厢车属于同一个产品族,2.4排量两厢车和2.4排量三厢车属于另一个产品族。

        明白了等级结构和产品族的概念,就理解工厂方法模式和抽象工厂模式的区别了,如果工厂的产品全部属于同一个等级结构,则属于工厂方法模式;如果工厂的产品来自多个等级结构,则属于抽象工厂模式。在本例中,如果一个工厂模式提供2.0排量两厢车和2.4排量两厢车,那么他属于工厂方法模式;如果一个工厂模式是提供2.4排量两厢车和2.4排量三厢车两个产品,那么这个工厂模式就是抽象工厂模式,因为他提供的产品是分属两个不同的等级结构。当然,如果一个工厂提供全部四种车型的产品,因为产品分属两个等级结构,他当然也属于抽象工厂模式了。

抽象工厂模式的优点

        抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。

抽象工厂模式的缺点

       产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。

适用场景

       当需要创建的对象是一系列相互关联或相互依赖的产品族时,便可以使用抽象工厂模式。说的更明白一点,就是一个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束,就可以使用抽象工厂模式。假如各个等级结构中的实现类之间不存在关联或约束,则使用多个独立的工厂来对产品进行创建,则更合适一点。

总结

       无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。

       所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。

 
  1. <?php

  2. /**

  3. * 抽象工厂模式

  4. * -------------

  5. * @author zhaoxuejie <[email protected]>

  6. * @package design pattern

  7. * @version v1.0 2011-12-14

  8. */

  9.  
  10. //---------------------------------------------------------------------------

  11. // 抽象工厂(AbstractFactory)角色:它声明一个创建抽象产品对象的接口。

  12. // 通常以接口或抽象类实现,所有的具体工厂类必须实现这个接口或继承这个类。

  13. //---------------------------------------------------------------------------

  14. // 具体工厂(ConcreteFactory)角色:实现创建产品对象的操作。

  15. // 客户端直接调用这个角色创建产品的实例。这个角色包含有选择合适的产品对象的逻辑。通常使用具体类实现。

  16. //---------------------------------------------------------------------------

  17. // 抽象产品(Abstract Product)角色:声明一类产品的接口。它是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。

  18. //---------------------------------------------------------------------------

  19. // 具体产品(Concrete Product)角色:实现抽象产品角色所定义的接口,定义一个将被相应的具体工厂创建的产品对象。

  20. // 其内部包含了应用程序的业务逻辑。

  21. //---------------------------------------------------------------------------

  22.  
  23. ///抽象工厂

  24. interface AnimalFactory{

  25. public function createCat();

  26. public function createDog();

  27. }

  28.  
  29. //黑色动物具体工厂

  30. class BlackAnimalFactory implements AnimalFactory{

  31. function createCat(){

  32. return new BlackCat();

  33. }

  34. function createDog(){

  35. return new BlackDog();

  36. }

  37.  
  38. }

  39. //白色动物具体工厂

  40. class WhiteAnimalFactory implements AnimalFactory{

  41. function createCat(){

  42. return new WhiteCat();

  43. }

  44. function createDog(){

  45. return new WhiteDog();

  46. }

  47. }

  48.  
  49. //抽象产品

  50. interface Cat{

  51. function Voice();

  52. }

  53. interface Dog{

  54. function Voice();

  55. }

  56.  
  57.  
  58. //具体产品

  59. class BlackCat implements Cat {

  60.  
  61. function Voice(){

  62. echo '黑猫喵喵……';

  63. }

  64. }

  65.  
  66. class WhiteCat implements Cat {

  67.  
  68. function Voice(){

  69. echo '白猫喵喵……';

  70. }

  71. }

  72.  
  73. class BlackDog implements Dog {

  74.  
  75. function Voice(){

  76. echo '黑狗汪汪……';

  77. }

  78. }

  79.  
  80. class WhiteDog implements Dog {

  81.  
  82. function Voice(){

  83. echo '白狗汪汪……';

  84. }

  85. }

  86.  
  87.  
  88. //客户端

  89.  
  90.  
  91. class CLient{

  92. public static function main(){

  93. self::run(new BlackAnimalFactory());

  94. self::run(new WhiteAnimalFactory());

  95. }

  96. public static function run(AnimalFactory $AnimalFactory){

  97.  
  98. $cat=$AnimalFactory->createCat();

  99. $cat->Voice();

  100. $dog=$AnimalFactory->createDog();

  101. $dog->Voice();

  102. }

  103. }

  104. CLient::main();

猜你喜欢

转载自blog.csdn.net/zhao_teng/article/details/87689695