我们关注的内容:
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());
是不是不下次再新增一种支付方式的时候就不用修改工厂类了呢

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