我们关注的内容:
1 使用场景分析
2 案例代码解析
一 使用场景分析
抽象工厂模式,为创建一组相关或项目依赖的对象提供一个接口,而且无需指定他们具体的类。抽象工厂模式的通用类图如下:
通俗的来讲:拥有共同的属性和方法体,但是具体的实现内容不同,即可使用抽象工厂模式。
二 案例代码解析
案例场景:B2C电子商务的支付系统,一个电子商城需要集成不同方式的支付系统,比如支付宝,网银在线,paypal等,他们共同的特点是需要用户提供用户资料,支付完成之后反馈给系统一个状态或数据。
具体实现图如下:
先创建一个支付的抽象类AbstractPay:
public abstract class AbstractPay { /// <summary> /// 生成支付链接 /// </summary> /// <returns></returns> public abstract string Pay(); /// <summary> /// 支付完成之后对支付结果进行记录 /// </summary> /// <returns></returns> public abstract string PayResutl(); }
根据支付需求,产生不同实现的支付方式,支付宝实现Zhifubao:
public class Zhifubao:AbstractPay { public override string Pay() { string result = "zhifubao.com"; return result.ToString(); } public override string PayResutl() { return "支付宝成功支付!"; } }
网银在线实现BankOnLine:
public class BankOnLine : AbstractPay { public override string Pay() { string result = "bankonline.com"; return result.ToString(); } public override string PayResutl() { return "网银在线成功支付!"; } }
现在开始创建这个工厂,具体代码如下:
public abstract class PayFactory { public static Zhifubao CreateZhifubao() { return new Zhifubao(); } public static BankOnLine CreateBankOnLine() { return new BankOnLine(); } }
客户端调用如下:
AbstractPay zfb = PayFactory.CreateZhifubao(); Console.WriteLine(zfb.Pay()); Console.WriteLine(zfb.PayResutl()); AbstractPay oline = PayFactory.CreateBankOnLine(); Console.WriteLine(oline.Pay()); Console.WriteLine(oline.PayResutl());
输出结果图:
提升:现在开始思考,如果我新增一个支付方式paypal,该如何做呢?
新增一个paypal类实现:
public class Paypal: AbstractPay { public override string Pay() { string result = "paypal.com"; return result.ToString(); } public override string PayResutl() { return "paypal成功支付!"; } }
下面就要修改工厂才能实现,如何不用修改工厂就能实现呢?可以使用反射的原理来实现。将工厂类修改如下:
public abstract class PayFactory { protected static string myAssemblyName = "FactoryTest"; protected static string Mynamespace = "DesignPattern."; public static AbstractPay CreatePay(string ClassName) { return (AbstractPay)Assembly.Load(myAssemblyName).CreateInstance(Mynamespace + ClassName); } }
客户端调用如下:
AbstractPay paypal = PayFactory.CreatePay("Paypal");
Console.WriteLine(paypal.Pay());
Console.WriteLine(paypal.PayResutl());
是不是不下次再新增一种支付方式的时候就不用修改工厂类了呢
欢迎大家一起探讨最佳实现方式!