PHP设计模式:工厂模式之简单工厂

要写出漂亮的代码,掌握一些常用的设计模式是很有必要的。这篇文章只是我将设计模式应用在OO PHP的系列学习(之前一直是在JAVA里面)笔记之一,如有不妥,就留言一起探讨。

根据设计模式的圣经GoF所写的Design Patterns: Elements of Reusable Object-Oriented Software一书的分类,工厂模式被归类在创建模式(Creational Pattern)之下。工厂模式作为一种创建模式,主要用于处理对象的创建,以适合不同场景[via]。

工厂模式又分为抽象工厂模式和工厂方法模式。

本文所讨论的简单工厂,又称作静态工厂方法,可以看作是工厂方法的一个特例。个人认为它是学习工厂模式最好的切入点。

工厂模式,正如其名,我们在实例化一个对象时,不是直接实例化具体的对象,而是通过工厂这个接口来实现。通俗的说,作为消费者(某个对象A),我们在需要消费(调用)某个具体产品(其他对象B)时,不需要了解这个产品(对象B)的制作过程(实现过程),只需要直接拿这个产品来用即可。而具体的这个产品的生成(对象的实例化)过程,由工厂实现。

可见,工厂模式可以在降低对象间的关联(耦合度降低),并能够隐藏具体产品的实现过程。因为整个调用过程是面向接口的。

下面是简单工厂在PHP 5中的简单实现:

//简单工厂模式的PHP实现
 
//产品模型(汽车图纸模型)
interface ICar
{
 function produce();
}
 
//产品实现(一辆奔驰车的具体生成)
class Benz implements ICar
{
 function __construct()
 {
 }
 
 function produce()
 {
  echo "A new Benz  is produced!";
 }
}
//产品实现(一辆奥迪车的具体生产)
class Audi implements ICar
{
 function __construct()
 {
 }
 
 function produce()
 {
  echo "A new Audi is produced!";
 }
}
 
//工厂中的同一类对象都应该实现同一个接口
class CarFactory 
{
 
 public static function getInstance($brand)
 {
  if('benz' === $brand)
  {//消费者(测试代码或测试类)向工厂发出需要一辆奔驰的指令
   return new Benz();//实例化一个Benz对象
  }
  else if('audi' === $brand)
  {
   return new Audi();
  }
 }
}
 
//test
$car =  CarFactory::getInstance('benz');//发出需要奔驰车的指令
echo $car->produce();//我们不需要考虑也并不知道这辆奔驰车是如何制造的
echo '
';
$car = CarFactory::getInstance('audi');
echo $car->produce();

从代码中可以看到,在调用者需要实例化具体对象时,是通过工厂来实现的,而不是对象本身。它的好处在于,因为工厂隐藏了具体对象的实例化逻辑,如果在之后要对实例化过程进行修改,在工厂中进行即可。对于消费者来说,不需要修改一行代码。

但简单工厂也有一个很明显的缺点,那就是每变增加或减少一个实例对象,就需要对其进行修改。比如,现在工厂决定增加生产Aston Martin这种车,那么我们需要修改工厂的逻辑来应对这种需求。这是静态工厂方法,这里的“静态”所带来的缺陷。

所以在实际中应尽量避免这种情况的出现,或采用工厂模式的另一个子类:抽象工厂。

标签: php,设计模式

4 个评论 »
  1. 华晨 华晨
    August 14, 2009, 9:55 am

    说实话,我是一点看不懂。

  2. Saturn Saturn
    August 14, 2009, 11:50 am

    @华晨

    设计模式是程序设计的灵魂,等你有一天技术到达瓶颈,再回过头来看,应该会感觉很有意思。

  3. 华晨 华晨
    August 14, 2009, 12:24 pm

    我现在写程序会有点乱,php代码会都是结构的,不会面向对象。还有没有自定义的函数。对自定义函数不是很清楚,所以不敢用。有哪些这方面的资料么?或者简单的程序实例么?

  4. Saturn Saturn
    August 14, 2009, 1:50 pm

    开始做程序,不管是什么程序,不用太多的考虑自己写的程序符不符合所谓的标准,是实现功能熟悉环境为主。但是到了一个阶段,你会发现自己处于一个瓶颈,此时,技术已经不是问题了,有问题的是编程思想和程序结构。到了这里再来用OOP的一些概念也不迟。至于说程序写的乱,开始接触一个程序这很正常的。我个人推荐你使用框架,比如我博客用的CI或者Cake PHP.

回应此文

你也可以选择引用此文章.