v工厂方法模式
1.介绍:
工厂方法模式Factory Method,又称多态性工厂模式。在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
2.定义:
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
3.延伸:
在上面简单工厂的引入中,我们将实例化具体对象的工作全部交给了专门负责创建对象的工厂类(场务)中,这样就可以在我们得到导演的命令后创建对应的车(产品)类了。但是剧组的导演是性情比较古怪的,可能指令也是无限变化的。这样就有了新的问题,一旦导演发出的指令时我们没有预料到的,就必须得修改源代码。这也不是很合理的。工厂方法就是为了解决这类问题的。
4.模拟场景:
还是上面范·迪塞尔要去参加五环首届跑车拉力赛的场景。因为要拍摄《速度与激情8》,导演组车的种类增多了,阵容也更加豪华了,加上导演古怪的性格可能每一场戏绝对需要试驾几十种车。如果车库没有的车(具体产品类)可以由场务(具体工厂类)直接去4S店取,这样没增加一种车(具体产品类)就要对应的有一个场务(具体工厂类),他们互相之间有着各自的职责,互不影响,这样可扩展性就变强了。
5.工厂方法UML类图: (UML图是我用windows自带的paint手工画的,所以可能不是很专业
6.代码演示:
抽象工厂代码:
namespace CNBlogs.DesignPattern.Common { public interface IFactory { ICar CreateCar(); } }
抽象产品代码:
namespace CNBlogs.DesignPattern.Common { public interface ICar { void GetCar(); } }
具体工厂代码:
namespace CNBlogs.DesignPattern.Common { 具体工厂类: 用于创建跑车类 SportFactory : IFactory { public ICar CreateCar() { return new SportCar(); } } 具体工厂类: 用于创建越野车类 JeepFactory : IFactory { public ICar CreateCar() { return new JeepCar(); } } 具体工厂类: 用于创建两厢车类 HatchbackFactory : IFactory { public ICar CreateCar() { return new HatchbackCar(); } } }
具体产品代码:
namespace CNBlogs.DesignPattern.Common { 具体产品类: 跑车 SportCar : ICar { public void GetCar() { Console.WriteLine(); } } 具体产品类: 越野车 JeepCar : ICar { public void GetCar() { Console.WriteLine(); } } 具体产品类: 两箱车 HatchbackCar : ICar { public void GetCar() { Console.WriteLine(); } } }
客户端代码:
//------------------------------------------------------------------------------ // <copyright file="Program.cs" company="CNBlogs Corporation"> // Copyright (C) 2015-2016 All Rights Reserved 作 者: 请叫我头头哥 // </copyright> CNBlogs.DesignPattern { using System.IO; using System.Configuration; using System.Reflection; using CNBlogs.DesignPattern.Common; class Program { static void Main(string[] args) { factoryType = ConfigurationManager.AppSettings[]; // 这里把DLL配置在数据库是因为以后数据可能发生改变 dllName = ConfigurationManager.AppSettings[]; currentAssembly = System.Reflection.Assembly.GetExecutingAssembly(); string codeBase = currentAssembly.CodeBase.ToLower().Replace(currentAssembly.ManifestModule.Name.ToLower(), string.Empty); IFactory factory = Assembly.LoadFrom(Path.Combine(codeBase, dllName)).CreateInstance(factoryType) as IFactory; ICar car = factory.CreateCar(); car.GetCar(); } } }
7.工厂方法的优点/缺点: