本文转载自Scott Millett的Professional ASP.NET Design Patterns。
(正在学习打字,找了一本书练习。)
业务逻辑层:模式
1、Factory Method模式
Factory Method模式用于在不指定待创建对象的具体类的情况下创建对象。主要意图是隐藏对象创建这一任务的复杂性。客户将面向接口或抽象类进行编码,让Factory类创建具体的类型。通常,Factory类有一个返回接口或抽象类的静态方法。
在这个虚构的电子商务应用程序中,采用Factory Method模式来选择正确的货运公司。
首先,创建一个FactoryPattern的解决方案和一个命名为FactoryPattern.Model的类库。
然后,构建简单的领域模型,该模型由Order实体和Address值对象组成,分别表示真实的订单和送货地址。代码如下:
namespace FactoryPattern.Model
{
public class Address
{
public string CountryCode {get; set;}
}
}
namespace FactoryPattern.Model
{
pulic class Order
{
public decimal TotalCost {get; set;}
public decimal WeightInKG {get; set;}
public string CourierTrackingId {get; set;}
public Address DispatchAddress {get; set;}
}
}
接下来,为货运公司创建接口:
namespace FactoryPattern.Model
{
public interface IShippingCourier
{
string GenerateConsignmentLabelFor (Address address);
}
}
添加接口的两个实现:
namespace FactoryPattern.Model
{
public class DHL : IShippingCourier
{
public string GenerateConsignmentLabelFor(Address address)
{
return "DHL-xxxx-xxxx-xxxx";
}
}
}
namespace FactoryPattern.Model
{
public class RoyalMail : IShippingCourier
{
public string GenerateConsignmentLabelFor(Address address)
{
return "RM-xxxx-xxxx-xxxx";
}
}
}
Factory类的作用是根据订单的价值和重量来确定使用哪家货运公司:
namespace FactoryPattern.Model
{
pulic static class UKShippingCourierFactory
{
public static IShippingCourier CreateShippingCourier(Order order)
{
if ((order.TotalCost > 100) || (order.WeightInKG > 5))
return new DHL();
else
return new RoyalMail();
}
}
}
最后,添加OrderService类,Dispatch方法协调有效货运公司的获取以及托运标识符的创建
namespace FactoryPattern.Model
{
public class OrderService
{
public void Dispatch(Order order)
{
IShippingCourier shippingCourier = UKShippingCourierFactory.CreateShippingCourier(order);
order.CourierTackingId = shippingCourier.GenerateConsignmentLabelFor(order.DispatchAddress);
}
}
}
Factory类负责根据某种业务规则创建有效的货运公司。通过将业务逻辑抽象出来放入Factory类中,为OrderSerivce类减轻了负担,使其关注于单一责任。