抽象工厂使用抽象方法创建基类,该抽象方法为应创建的对象定义方法。派生基类的每个工厂类可以为每种对象类型创建自己的实现。
工厂方法只是用于在类中创建对象的简单方法。通常将其添加到聚合根中(Order
该类的方法称为CreateOrderLine
)
抽象工厂
在下面的示例中,我们设计了一个接口,以便我们可以将队列创建与消息传递系统分离,因此可以为不同的队列系统创建实现,而无需更改代码库。
interface IMessageQueueFactory
{
IMessageQueue CreateOutboundQueue(string name);
IMessageQueue CreateReplyQueue(string name);
}
public class AzureServiceBusQueueFactory : IMessageQueueFactory
{
IMessageQueue CreateOutboundQueue(string name)
{
//init queue
return new AzureMessageQueue(/*....*/);
}
IMessageQueue CreateReplyQueue(string name)
{
//init response queue
return new AzureResponseMessageQueue(/*....*/);
}
}
public class MsmqFactory : IMessageQueueFactory
{
IMessageQueue CreateOutboundQueue(string name)
{
//init queue
return new MsmqMessageQueue(/*....*/);
}
IMessageQueue CreateReplyQueue(string name)
{
//init response queue
return new MsmqResponseMessageQueue(/*....*/);
}
}
工厂方法
HTTP服务器中的问题是,对于每个请求,我们总是需要一个响应。
public interface IHttpRequest
{
// .. all other methods ..
IHttpResponse CreateResponse(int httpStatusCode);
}
如果没有工厂方法,HTTP服务器用户(即程序员)将被迫使用特定于实现的类,这将使 IHttpRequest
接口的作用。
因此,我们引入了工厂方法,以便抽象出响应类的创建。
摘要
区别在于包含工厂方法的类的预期目的不是创建对象,而抽象工厂只能用于创建对象。
使用工厂方法时应格外小心,因为在创建对象时很容易破坏LSP(Liskov替换原理)。