Php设计模式之工厂模式(一)简单工厂模式

本文分析了现有狗克隆生产代码存在的问题,并提出使用工厂方法模式解决类耦合问题。通过引入抽象类、简单工厂类及具体工厂类,实现了代码的解耦和复用,遵循了开闭原则。讨论了工厂方法模式的应用场景及限制,为后续优化提供了思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考地址:http://blog.youkuaiyun.com/uuleaf/article/details/7572509

案例

黑枣克隆公司是专门批量生产克隆狗的一家企业。当克隆出一只黑狗的实现代码如下

<实现代码>

  1. class DogGener{  
  2.     public function create($color){  
  3.         if($color == 'black'){  
  4.             $dog = new BlackDog();  
  5.             $dog->shout();  
  6.         }  
  7.         if($color == 'red'){  
  8.             $dog = new RedDog();  
  9.             $dog->shout();  
  10.         }  
  11.     }  
  12. }  
  13. class BlackDog{  
  14.     public function shout(){  
  15.         echo "Black Wao!Wao!Wao! \n";  
  16.     }  
  17. }  
  18.   
  19. class RedDog  
  20. {  
  21.     public function shout()  
  22.     {  
  23.         echo "Red Wao!Wao!Wao! \n";  
  24.     }  
  25. }  
  26.   
  27. $doggen = new DogGener();  
  28. $doggen->create('black');  


分析OOA

软件工程师发现,DogGener类的create方法随着Dog各类不断扩充而变得难以维护。DogGener类目前是依赖于大量的Dog类,并且将DogGener类与Dog类紧密耦合。这些类之前相互通信,但我们并不希望它们绑定在一起。

面向对象设计强调“抽象类高于实现”。也就是说,我们尽量一般化而不是特殊化。工厂方法解决了当你的代码关注于抽象类型时如何创建对象实例的问题。我们使用特定的类来处理实例化。我们先来使用简单工厂方法(Simple Factory;

设计OOD:

<UML>


<说明>

1. 抽象类Dog为狗的基类,定义所有Dog都应该实现shout方法

2. RedDogBlackDogDog类的特化

3. SimpleDogFactory为简单工厂类,定义了静态方法create,接受color参数创建并返回Dog实例

编程 OOP:

<代码>

  1. abstract class Dog{  
  2.     abstract function shout();  
  3. }  
  4.   
  5. class RedDog extends Dog  
  6. {  
  7.     public function shout()  
  8.     {  
  9.         echo "Red Wao!Wao!Wao! \n";  
  10.     }  
  11. }  
  12.   
  13. class BlackDog extends Dog  
  14. {  
  15.     public function shout()  
  16.     {  
  17.         echo "Black Wao!Wao!Wao! \n";  
  18.     }  
  19. }  
  20.   
  21.   
  22.   
  23. class SimpleDogFactory{  
  24.     public static function create($color){  
  25.         $dogtype = ucfirst( strtolower($color)).'Dog';  
  26.         if(class_exists($dogtype)){  
  27.             return new $dogtype();  
  28.         }  
  29.     }  
  30. }  


测试用例Test Case:

<代码>

  1. class testDriver  
  2. {  
  3.     public function run()  
  4.     {  
  5.         //生产一条黑狗  
  6.         $dog = SimpleDogFactory::create('black');  
  7.         $dog->shout();  
  8.         //生产一条红狗  
  9.         $dog = SimpleDogFactory::create('red');  
  10.         $dog->shout();  
  11.     }  
  12. }  
  13.   
  14. $test = new testDriver();  
  15. $test->run();  

<输出>


小结:

我们从开闭原则(对扩展开放;对修改封闭)上来分析下简单工厂模式。

当需要生产一只狗的时候,只需要通知工厂类SimpleDogFactory狗的颜色Color就可以了。具体的生产过程全封装在SimpleDogFactory中,所以对产品部分来说,它是符合开闭原则的。

但是工厂部分好像不太理想,因为每增加个类狗,都要在工厂类中增加相应的业务逻辑或者判断逻辑,这显然是违背开闭原则的。可想而知对于新产品的加入,工厂类是很被动的。对于这样的工厂类,我们称它为全能类或者上帝类。我们举的例子是最简单的情况,而在实际应用中,很可能产品是一个多层次的树状结构。由于简单工厂模式中只有一个工厂类来对应这些产品,所以这可能会把我们的上帝累坏了,也累坏了我们这些程序员

于是工厂方法模式作为救世主出现了。 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值