2010-03-26 34 views
2

我只想知道PHP中的工厂是什么,如何在代码中使用它?什么是工厂在PHP中,它可以如何有用?

它是否有其优点和缺点?

+0

工厂是一种设计模式。它不是特定于PHP。 – 2010-03-26 06:29:38

+1

http://stackoverflow.com/questions/2083424/what-is-a-factory-design-pattern-in-php(和其他人)的副本 – VolkerK 2010-03-26 07:59:13

回答

7

一个AbstractFactory创力Design Pattern,即

提供用于创建相关或依赖的对象,而无需指定它们具体的类的接口。

简而言之:

class MercedesFactory 
{ 
    public static function createCar() 
    { 
     $engine = new MercedesEngine; 
     $car = new Mercedes($engine); 
     return $car; 
    } 
} 

也有Factory Method,其

定义创建对象的接口,但让子类决定实例化哪个类。工厂方法让类将实例化推迟到子类。

一言以蔽之:

class User 
{ 
    public static function create() 
    { 
     return new self; 
    } 
} 
1

这是一个函数,creates classes。如果您需要批量创建具有较小行为差异的类,那么它很有用。另一方面,滥用导致诸如FactoryFactoryFactoryFactoryFactoryFactory之类的事情。

7

厂是最有用的模式之一,因为它提供了一种从代码中删除特定的类名,使它更容易支持和重构。

考虑这样一个例子:你有发送电子邮件,并使用“梅勒类用于此目的的应用程序:

class Site 

    function sendWelcomeMail 
    $m = new Mailer; 
    $m->send("Welcome..."); 

    function sendReminderMail 
    $m = new Mailer; 
    $m->send("Reminder..."); 

etc... 

有一天你决定使用其他邮件类,称为“NewMailer”。使用上面的代码,你必须找到所有Mailer的出现,并将它们手动替换成NewMailer。这可能是一个大型项目的真正痛苦。

用工厂当你需要一个对象,你不使用“新”和特定的类名,只是调用一个方法

class Factory 

     function createMailer() 
      return new Mailer; 


class Site 

    function sendWelcomeMail 
    $m = Factory::createMailer(); 
    $m->send("Welcome..."); 

    function sendReminderMail 
    $m = Factory::createMailer(); 
    $m->send("Reminder..."); 

etc... 

遍布你只需要改变一个单一的地方与NewMailer取代梅勒在工厂方法行。

+0

虽然你应该添加一个'新的Foo'交换'FooFactory :: create'仍然是一个硬编码和隐式依赖。两者都很难进行单元测试。 – Gordon 2010-03-26 07:56:57

+0

真棒。我发现最简单的解释。 80%的其他解释只是复制/粘贴的php.net手册。 – Stann 2010-12-05 09:02:52

+0

很好的解释 – tesmojones 2013-11-06 09:56:17

相关问题