抽象工厂创建一个基类并定义了创建对象的抽象方法。派生自基类的每个工厂类都可以为每种对象类型创建自己的实现。
工厂方法是一个简单的方法,用于在类中创建对象。通常将其添加到聚合根(例如Order
类有一个名为CreateOrderLine
的方法)中。
抽象工厂
在下面的示例中,我们设计了一个接口,以便可以将队列创建与消息系统解耦,并因此可以创建不同队列系统的实现,而无需更改代码库。
interface IMessageQueueFactory
{
IMessageQueue CreateOutboundQueue(string name);
IMessageQueue CreateReplyQueue(string name);
}
public class AzureServiceBusQueueFactory : IMessageQueueFactory
{
IMessageQueue CreateOutboundQueue(string name)
{
return new AzureMessageQueue();
}
IMessageQueue CreateReplyQueue(string name)
{
return new AzureResponseMessageQueue();
}
}
public class MsmqFactory : IMessageQueueFactory
{
IMessageQueue CreateOutboundQueue(string name)
{
return new MsmqMessageQueue();
}
IMessageQueue CreateReplyQueue(string name)
{
return new MsmqResponseMessageQueue();
}
}
工厂方法
HTTP服务器面临的问题在于我们必须为每个请求提供响应。
public interface IHttpRequest
{
IHttpResponse CreateResponse(int httpStatusCode);
}
如果没有工厂方法,HTTP服务器的用户(即程序员)将被迫使用特定于实现的类,这违背了 IHttpRequest
接口的目的。
因此,我们引入了工厂方法,以便将响应类的创建也抽象化。
总结
区别在于包含工厂方法的类的预期目的不是创建对象,而抽象工厂应仅用于创建对象。
在使用工厂方法时应当小心,因为在创建对象时容易破坏LSP(里氏替换原则)。