2012年2月29日星期三

抽象工厂模式之我用

我们关注的内容:

1 使用场景分析

2 案例代码解析

一 使用场景分析

抽象工厂模式,为创建一组相关或项目依赖的对象提供一个接口,而且无需指定他们具体的类。抽象工厂模式的通用类图如下:

image

通俗的来讲:拥有共同的属性和方法体,但是具体的实现内容不同,即可使用抽象工厂模式。

二 案例代码解析

案例场景:B2C电子商务的支付系统,一个电子商城需要集成不同方式的支付系统,比如支付宝,网银在线,paypal等,他们共同的特点是需要用户提供用户资料,支付完成之后反馈给系统一个状态或数据。

具体实现图如下:

image

先创建一个支付的抽象类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());

输出结果图:

image

提升:现在开始思考,如果我新增一个支付方式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());
是不是不下次再新增一种支付方式的时候就不用修改工厂类了呢微笑

欢迎大家一起探讨最佳实现方式!


抽象工厂模式之我用

TAG: