简介:
简单工厂模式(Simple Factory)又称为静态工厂方法(Static Factory Method模式,不属于23种GOF设计模式之一。
专门创建一个工厂对象来负责创建出哪一个产品类的实例,被创建的产品类往往具有相同的父类或接口。属于类的创建型模式,通常根据一个条件(参数)来返回不同的类的实例。
简单工厂模式,主要由三部分组成:
简单工厂模式,主要由三部分组成:
- 工厂角色(Creator)
整个简单工厂模式的核心,它负责实现创建所有具体产品类的实例。工厂类可以被外界直接调用,创建所需的产品对象。 - 抽象产品角色(Product)
是所有具体产品角色的父类,它负责描述所有实例所共有的公共接口。 - 具体产品角色(Concrete Product)
继承自抽象产品角色,一般为多个,是简单工厂模式的创建目标。工厂类返回的都是该角色的某一具体产品。
例子:你肯德基取买汉堡,今天你吃鸡腿汉堡,你对服务员说,给我拿个鸡腿汉堡,服务员就给你鸡腿汉堡。明天你想吃田园汉堡,你对服务员说,给我拿个田园汉堡,服务员就给你田园汉堡。
具体示例:
目前一个交易系统中有很多种交易,如现货交易、期货交易,现在需要对交易的修改进行备案记录操作。
需求简单分析:
- 每种交易的修改备案记录方法都不一样
- 对外统一接口
- 支持以后新增交修改备案记录的扩展
代码分析:
- 基础数据对象,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 即可。
简单工厂将对象的创建封装起来,使外面的调用对象不用关心具体实现细节。
但是很明显违反了高内聚低耦合的原则,因此一般只在简单子类较少、同一品种类中等简单情况下使用。