回答
一个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;
}
}
这是一个函数,creates classes。如果您需要批量创建具有较小行为差异的类,那么它很有用。另一方面,滥用导致诸如FactoryFactoryFactoryFactoryFactoryFactory
之类的事情。
厂是最有用的模式之一,因为它提供了一种从代码中删除特定的类名,使它更容易支持和重构。
考虑这样一个例子:你有发送电子邮件,并使用“梅勒类用于此目的的应用程序:
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取代梅勒在工厂方法行。
虽然你应该添加一个'新的Foo'交换'FooFactory :: create'仍然是一个硬编码和隐式依赖。两者都很难进行单元测试。 – Gordon 2010-03-26 07:56:57
真棒。我发现最简单的解释。 80%的其他解释只是复制/粘贴的php.net手册。 – Stann 2010-12-05 09:02:52
很好的解释 – tesmojones 2013-11-06 09:56:17
- 1. 在PHP中使用open_basedir有什么用,它是如何工作的?
- 2. 什么是反射,它可以在c#中使用什么?
- 3. 什么是OOP工厂
- 4. 什么是MD5CryptoServiceProvider,它可以做什么?
- 5. EJB。什么是它为什么存在以及它如何工作?
- 6. 如果某工厂存在,我可以问工厂女工吗?
- 7. 在以下示例中使用抽象工厂的真正好处是什么,而不是工厂方法?
- 8. 什么是.NET中的Channel工厂?
- 9. PHP和MySQL中的绑定是什么?它有什么用途?
- 10. 在kdb工厂中使用tickerplant有什么用处?
- 11. 什么是LINQ?我如何在PHP中使用它?
- 12. 是否可以在deviceready中调用工厂绑定变量?
- 13. 为什么工厂方法在GoF工厂方法中没有参数
- 14. 什么是Cometd?为什么它被使用和如何工作
- 15. 在Ruby中“=>”是什么意思,它是如何工作的?
- 16. activeandroid中的mId是什么以及它何时可以为null?
- 17. 什么是PS3 Root密钥/它有什么作用/它是如何使用的?
- 18. 在.NET/C#上下文中,什么是二进制搜索以及如何/为什么可以使用它?
- 19. 什么是BigInteger,我们什么时候可以使用它?
- 20. 什么是web.xml文件,我可以用它做什么?
- 21. 异常工厂的价值是什么?
- 22. 工厂模式的优势是什么?
- 23. 什么是ElasticSearch以及它如何有用?
- 24. 什么是IOR文件,它是做什么的,它是如何工作的?
- 25. 什么是(void(**)())以及如何typedef它?
- 26. 如何使用Sys.Services.AuthenticationService的工作原理和什么可以防止它工作
- 27. MVP,请求工厂,还有什么?
- 28. 我的工厂有什么问题?
- 29. 什么是弃用?如何在所有版本中处理它?
- 30. 有什么方法可以确定它是否是测试(.NET)?
工厂是一种设计模式。它不是特定于PHP。 – 2010-03-26 06:29:38
http://stackoverflow.com/questions/2083424/what-is-a-factory-design-pattern-in-php(和其他人)的副本 – VolkerK 2010-03-26 07:59:13