在面向对象编程中,一般方法是用一个new操作符产生一个对象的实例。但是在一些情况下,用new操作符直接生成对象会带来一些问题。首先,要使用new运算符创建一个对象必须清楚所要创建的对象的类信息,包括类名、构造函数等,而有时并不现实。其次许多类型的对象创建需要一系列的步骤,可能需要计算或取得对象的初始设置,选择生成哪个子对象实例,或在生成需要的对象之前必须生成一些辅助功能的对象。在这些情况下,新对象的建立就是一个过程,而不是一个简单的操作。为轻松方便地完成复杂对象的创建,从而引入了工厂模式。
简单工厂模式又叫静态工程方法模式,定义一个Factory静态类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类。
Client通常不指定要创建的具体类,Client将面向接口或抽象类进行编码,让Factory类负责创建具体的类型。通常Factory类有一个返回抽象类或者接口的静态方法。Client通常提供某种信息让Factory类使用提供的信息来确定创建并返回哪个子类。
将创建子类的责任抽象出来的好处是允许Client完全无需考虑依赖类是如何创建的,这遵守依赖倒置原则(Dependency Inversion Principle,DIP)。工厂模式另外一个好处是把负责对象创建的代码集中起来,如果需要修改对象生成方式,可以轻松定位并更新,而不会影响到依赖它的代码。
◊ 实现了创建和使用分离;
◊ Client无需知道所创建的具体类名,只需要知道具体类所对应的参数。
◊ Factory类集中了所有具体类的创建逻辑,职责过重。一旦需要添加新的具体类,则需要修改Factory逻辑。这样违背了OCP(开放-关闭原则)。
◊ 由于使用了static方法,造成Factory无法形成基于继承的结构。
结构图
支付接口使用简单工厂模式结构图
namespace Libraries.Test.DesignPattern.SimpleFactory
{
/// <summary>
/// 定义支付接口
/// </summary>
public interface IPay
{
bool Excute();
}
}
namespace Libraries.Test.DesignPattern.SimpleFactory
{
/// <summary>
/// 支付具体实现
/// </summary>
public class Alipay : IPay
{
public bool Excute()
{
//执行支付宝付款操作
return true;
}
}
}
namespace Libraries.Test.DesignPattern.SimpleFactory
{
/// <summary>
/// 支付具体实现
/// </summary>
public class Wechat : IPay
{
public bool Excute()
{
//执行微信付款操作;
return true;
}
}
}
namespace Libraries.Test.DesignPattern.SimpleFactory
{
/// <summary>
/// 工厂类
/// </summary>
public static class Factory
{
/// <summary>
/// 工厂方法
/// </summary>
/// <param name="paytype"></param>
/// <returns></returns>
public static IPay CreatePay(String paytype)
{
IPay ipay = null;
switch (paytype)
{
case "Wechat":
ipay = new Wechat();
break;
case "Alipay":
ipay = new Alipay();
break;
default:
ipay = new Alipay();
break;
}
return ipay;
}
}
}
namespace Libraries.Test.DesignPattern.SimpleFactory
{
public class Client
{
public void Excute()
{
//微信付款
IPay wechatPay = Factory.CreatePay("Wechat");
bool result = wechatPay.Excute();
//支付宝付款
IPay alipayPay = Factory.CreatePay("Alipay");
result = alipayPay.Excute();
}
}
}