一个AbstractFactory是创建型 设计模式,即
提供用于创建相关或从属对象族的接口,而无需指定其具体类.
简而言之:
class MercedesFactory
{
public static function createCar()
{
$engine = new MercedesEngine;
$car = new Mercedes($engine);
return $car;
}
}
Run Code Online (Sandbox Code Playgroud)
还有工厂方法,其中
定义用于创建对象的接口,但让子类决定实例化哪个类.Factory Method允许类将实例化延迟到子类.
简而言之:
class User
{
public static function create()
{
return new self;
}
}
Run Code Online (Sandbox Code Playgroud)
Factory是最有用的模式之一,因为它提供了一种从代码中删除特定类名的方法,使其更容易支持和重构.
考虑一个例子:你有一个发送电子邮件的应用程序,并为此目的使用'Mailer'类:
class Site
function sendWelcomeMail
$m = new Mailer;
$m->send("Welcome...");
function sendReminderMail
$m = new Mailer;
$m->send("Reminder...");
etc...
Run Code Online (Sandbox Code Playgroud)
有一天你决定使用另一个名为"NewMailer"的邮件程序.使用上面的代码,你必须找到所有出现的Mailer并将它们手动替换为NewMailer.这在大型项目中可能是一个真正的痛苦.
使用Factory时,不要使用"new"和特定的类名,只需在需要对象时调用方法即可
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...
Run Code Online (Sandbox Code Playgroud)
要在整个地方用NewMailer替换Mailer,只需在工厂方法中更改一行.