什么是PHP中的工厂devise模式?

这使我困惑,用最简单的话来说,它有什么作用? 假装你正在向你的母亲或某人求解。

工厂创build一个对象。 所以,如果你想build立

class A{ public $classb; public $classc; public function __construct($classb, $classc) { $this->classb = $classb; $this->classc = $classc; } } 

每当创build对象时,您都不想依赖于必须执行以下代码

 $obj = new ClassA(new ClassB, new Class C); 

那是工厂进来的地方。我们定义一个工厂来为我们处理这个问题:

 class Factory{ public function build() { $classc = $this->buildC(); $classb = $this->buildB(); return $this->buildA($classb, $classc); } public function buildA($classb, $classc) { return new ClassA($classb, $classc); } public function buildB() { return new ClassB; } public function buildC() { return new ClassC; } } 

现在我们所要做的就是

 $factory = new Factory; $obj = $factory->build(); 

真正的优势是当你想改变class级。 比方说,我们想通过一个不同的ClassC:

 class Factory_New extends Factory{ public function buildC(){ return new ClassD; } } 

或新的ClassB:

 class Factory_New2 extends Factory{ public function buildB(){ return new ClassE; } } 

现在我们可以使用inheritance来轻松地修改类的创build方式,以便放入一组不同的类。

这个用户类可能是一个很好的例子:

 class User{ public $data; public function __construct($data) { $this->data = $data; } } 

在这个类中, $data是我们用来存储数据的类。 现在对于这个类,让我们说我们使用一个会话来存储我们的数据。 工厂看起来像这样:

 class Factory{ public function build() { $data = $this->buildData(); return $this->buildUser($data); } public function buildData() { return SessionObject(); } public function buildUser($data) { return User($data); } } 

现在,让我们说,而不是我们所有的数据存储在数据库中,这是很简单的改变它:

 class Factory_New extends Factory{ public function buildData() { return DatabaseObject(); } } 

工厂是我们用来控制如何把对象放在一起的devise模式,使用正确的工厂模式可以创build我们需要的自定义对象。

就像一个真正的生命工厂一样,它创造了一些东西并将其返还。

想象一下这样的事情

 $joe = new Joe(); $joe->say('hello'); 

或工厂方法

 Joe::Factory()->say('hello'); 

工厂方法的实现将创build一个新实例并返回它。

一般来说,“工厂”会产生一些东西:在面向对象编程的情况下,“工厂devise模式”产生对象。

它不在于PHP,C#或任何其他面向对象的语言。

工厂devise模式(工厂模式)用于松耦合。 像工厂的意思,数据到工厂(产生数据)给最终用户。 这样,工厂就打破了数据源与数据处理之间的紧密耦合。

工厂只生成一个或多个对象。

你可能有一个build立MySQL连接的工厂。

http://en.wikipedia.org/wiki/Factory_method_pattern

这个答案与Daniel White说的使用工厂模式创buildMySQL连接的其他文章有关。

对于MySQL连接,我宁愿使用单例模式,因为你想使用相同的连接访问数据库而不是创build另一个连接。

实例化对象的经典方法是:

 $Object=new ClassName(); 

PHP有能力使用以下语法从variables名称dynamic创build一个对象:

 $Object=new $classname; 

其中variables$ classname包含要实例化的类的名称。

所以经典的对象保理看起来像:

 function getInstance($classname) { if($classname==='Customer') { $Object=new Customer(); } elseif($classname==='Product') { $Object=new Product(); } return $Object; } 

如果调用getInstance('Product')函数,则该工厂将创build并返回Product对象。 否则,如果调用getInstance('Customer')函数,该工厂将创build并返回Customertypes对象(由Customer()类创build)。

没有必要,可以将“Product”或“Customer”(现有类的确切名称)作为dynamic实例化的variables值:

 $classname='Product'; $Object1=new $classname; //this will instantiate new Product() $classname='Customer'; $Object2=new $classname; //this will instantiate new Customer() 

换句话说,像@Pindatjuh这样的工厂说,返回一个对象。

那么,与构造函数有什么不同呢? (也是这样)

  1. 一个构造函数使用他自己的实例。
  2. 一些我想要更高级的东西,我不想膨胀的对象(或添加依赖项)。
  3. 构造函数在每个实例被创build时被调用。 有时你不想要那个。

    例如,假设每次创build类Account的对象,我从数据库中读取一个文件并将其用作模板。

使用构造函数:

 class Account { var $user; var $pwd; var ... public __construct() { // here i read from the file // and many other stuff } } 

使用工厂:

 class Account { var $user; var $pwd; var ... } class AccountFactory { public static Create() { $obj=new Account(); // here we read the file and more stuff. return $obj; }