zoukankan      html  css  js  c++  java
  • 设计模式简单工厂模式(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 即可。
     
    简单工厂将对象的创建封装起来,使外面的调用对象不用关心具体实现细节。
    但是很明显违反了高内聚低耦合的原则,因此一般只在简单子类较少、同一品种类中等简单情况下使用。
  • 相关阅读:
    111.浮动初识 Walker
    105.灰度和对比度 Walker
    102.表格属性 Walker
    POJ 1321 棋盘问题
    HDU 1106 排序 题解
    HDU 1240 Asteroids! 解题报告
    HDU 1372 Knight Moves
    HDU 1253 胜利大逃亡
    HDU 1231:最大连续子序列 解题报告
    POJ 2251 Dungeon Master
  • 原文地址:https://www.cnblogs.com/liaozh/p/1539800.html
Copyright © 2011-2022 走看看