Factory Method模式


本文转载自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类减轻了负担,使其关注于单一责任。
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值