工厂方法模式是以一个类的实例化延迟到其子类。
工厂方法模式用于在不指定待创建对象的具体类的情况下创建对象。
工厂方法模式的主要意图是隐藏对象创建的复杂性。
◊使用工厂方法在一个类的内部创建对象通常比直接创建对象更灵活
◊工厂方法模式通过面向对象的手法,将所要创建的具体对象的创建工作延迟到子类,从而提供了一种扩展的策略,较好的解决了紧耦合的关系
结构图
支付接口使用工厂方法模式结构图
namespace Libraries.Test.DesignPattern.FactoryMethod
{
/// <summary>
/// 定义支付接口
/// </summary>
public interface IPay
{
bool Excute();
}
}
namespace Libraries.Test.DesignPattern.FactoryMethod
{
/// <summary>
/// 支付具体实现
/// </summary>
public class Alipay : IPay
{
public bool Excute()
{
//执行支付宝付款操作
return true;
}
}
}
namespace Libraries.Test.DesignPattern.FactoryMethod
{
/// <summary>
/// 支付具体实现
/// </summary>
public class Wechat : IPay
{
public bool Excute()
{
//执行微信付款操作;
return true;
}
}
}
namespace Libraries.Test.DesignPattern.FactoryMethod
{
/// <summary>
/// 工厂方法抽象类
/// </summary>
public abstract class AbstractFactory
{
public abstract IPay CreatePay();
}
}
namespace Libraries.Test.DesignPattern.FactoryMethod
{
/// <summary>
/// 工厂方法实现
/// </summary>
public class AlipayFactory : AbstractFactory
{
public override IPay CreatePay()
{
return new Alipay();
}
}
}
namespace Libraries.Test.DesignPattern.FactoryMethod
{
/// <summary>
/// 工厂方法实现
/// </summary>
public class WechatFactory : AbstractFactory
{
public override IPay CreatePay()
{
return new Wechat();
}
}
}
namespace Libraries.Test.DesignPattern.FactoryMethod
{
public class Client
{
public void Excute()
{
//微信付款
AbstractFactory wechatFactory = new WechatFactory();
IPay wechatPay = wechatFactory.CreatePay();
bool result = wechatPay.Excute();
//支付宝付款
AbstractFactory alipayFactory = new AlipayFactory();
IPay alipayPay = alipayFactory.CreatePay();
result = alipayPay.Excute();
}
}
}
工厂方法模式与简单工厂模式区别:
◊ 工厂方法模式和简单工厂模式在结构上的不同是很明显的。
◊ 工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体工厂类上。工厂方法模式可以允许很多具体工厂类从抽象工厂类中将创建行为继承下来,从而可以成为多个简单工厂模式的综合,进而推广了简单工厂模式。
◊ 工厂方法模式退化后可以变得很像简单工厂模式。如果非常确定一个系统只需要一个具体工厂类,那么就不妨把抽象工厂类合并到具体的工厂类中去。由于只有一个具体工厂类,所以不妨将工厂方法改成为静态方法,这时候就得到了简单工厂模式。