设计模式简单工厂模式(SimpleFactory)

简介:
简单工厂模式(Simple Factory)又称为静态工厂方法(Static Factory Method模式,不属于23种GOF设计模式之一。
 
专门创建一个工厂对象来负责创建出哪一个产品类的实例,被创建的产品类往往具有相同的父类或接口。属于类的创建型模式,通常根据一个条件(参数)来返回不同的类的实例。

简单工厂模式,主要由三部分组成:
  • 工厂角色(Creator)
    整个简单工厂模式的核心,它负责实现创建所有具体产品类的实例。工厂类可以被外界直接调用,创建所需的产品对象。
  • 抽象产品角色(Product)
    是所有具体产品角色的父类,它负责描述所有实例所共有的公共接口。
  • 具体产品角色(Concrete Product)
    继承自抽象产品角色,一般为多个,是简单工厂模式的创建目标。工厂类返回的都是该角色的某一具体产品。


例子:你肯德基取买汉堡,今天你吃鸡腿汉堡,你对服务员说,给我拿个鸡腿汉堡,服务员就给你鸡腿汉堡。明天你想吃田园汉堡,你对服务员说,给我拿个田园汉堡,服务员就给你田园汉堡。

具体示例:

目前一个交易系统中有很多种交易,如现货交易、期货交易,现在需要对交易的修改进行备案记录操作。

需求简单分析:

  1. 每种交易的修改备案记录方法都不一样
  2. 对外统一接口
  3. 支持以后新增交修改备案记录的扩展

代码分析:

  • 基础数据对象,Trade(交易基类)以及其子类BondTrade(现券交易) 和FutureTrade(期货交易),这三个跟简单工厂模式无关。
  • 抽象产品TradeDiff(交易修改备案基类)以及具体产品BondTradeDiff(现券修改备案记录)和FutureTradeDiff (期货修改备案)
/// <summary>
/// 交易备案修改(抽象产品角色Product)
/// </summary>
public abstract class TradeDiff
{
    public abstract void Diff(Trade aOldTrade, Trade aNewTrade);
}

/// <summary>
/// 现券交易备案修改(具体产品角色ConcreteProduct)
/// </summary>
public class BondTradeDiff : TradeDiff
{
    public override void Diff(Trade aOldTrade, Trade aNewTrade)
    {
        Console.WriteLine("记录现券交易备案!");
    }
}

/// <summary>
/// 期货交易备案修改(具体产品角色ConcreteProduct)
/// </summary>
public class FutureTradeDiff : TradeDiff
{
    public override void Diff(Trade aOldTrade, Trade aNewTrade)
    {
        Console.WriteLine("记录期货交易备案");
    }
}
  • 工厂角色TradeDiffFactory ,在里面决定了具体需要调用返回哪种交易,同时也作为对外接口。 
/// <summary>
/// 工厂类(工厂角色(Creator))
/// </summary>
public class TradeDiffFactory
{
    public TradeDiff GetDiff(Trade aTrade)
    {
        if (aTrade is BondTrade)
        {
            return new BondTradeDiff();
        }
        else if (aTrade is FutureTrade)
        {
            return new FutureTradeDiff();
        }
        else
        {
            Console.WriteLine("未支持的产品类,暂时不支持备案");
            return null;
        }
    }
}
  • 测试代码
class SimpleFactoryTest
{
    static void Main(string[] args)
    {
        TradeDiffFactory factory = new TradeDiffFactory();

        //记录现券交易修改备案
        Trade oldBondTrade = new BondTrade();
        Trade newBondTrade = new BondTrade();
        factory.GetDiff(newBondTrade).Diff(oldBondTrade, newBondTrade);

        //记录期货交易修改备案
        Trade oldFutureTrade = new FutureTrade();
        Trade newFutureTrade = new FutureTrade();
        factory.GetDiff(newBondTrade).Diff(oldFutureTrade, newFutureTrade);

        Console.ReadLine();
    }
}
补充分析:
简单工厂模式对同一基类下的子类较少时实现了较好支持。
比如:新增一个交易,回购交易(RepoTrade)需要支持交易修改备案。只需要新增一个具体产品类(RepoTradeDiff)和稍稍修改工厂类TradeDiffFactory 即可。
 
简单工厂将对象的创建封装起来,使外面的调用对象不用关心具体实现细节。
但是很明显违反了高内聚低耦合的原则,因此一般只在简单子类较少、同一品种类中等简单情况下使用。
原文地址:https://www.cnblogs.com/liaozh/p/1539800.html