HTML5技术

详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂) - 请叫我头头哥(2)

字号+ 作者:H5之家 来源:博客园 2015-10-23 10:52 我要评论( )

优点:简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。明确区分了各自的职责和权力,有利于整个软件体系结构的优化。 缺点:很明显工厂类集中了所有实例的创建逻辑,容易违反GRASPR的高内

  • 优点:简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。明确区分了各自的职责和权力,有利于整个软件体系结构的优化。
  • 缺点:很明显工厂类集中了所有实例的创建逻辑,容易违反GRASPR的高内聚的责任分配原则
  • v工厂方法模式

    1.介绍: 

    工厂方法模式Factory Method,又称多态性工厂模式。在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

    2.定义: 

    工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。

    3.延伸: 

    在上面简单工厂的引入中,我们将实例化具体对象的工作全部交给了专门负责创建对象的工厂类(场务)中,这样就可以在我们得到导演的命令后创建对应的车(产品)类了。但是剧组的导演是性情比较古怪的,可能指令也是无限变化的。这样就有了新的问题,一旦导演发出的指令时我们没有预料到的,就必须得修改源代码。这也不是很合理的。工厂方法就是为了解决这类问题的。

    4.模拟场景: 

    还是上面范·迪塞尔要去参加五环首届跑车拉力赛的场景。因为要拍摄《速度与激情8》,导演组车的种类增多了,阵容也更加豪华了,加上导演古怪的性格可能每一场戏绝对需要试驾几十种车。如果车库没有的车(具体产品类)可以由场务(具体工厂类)直接去4S店取,这样没增加一种车(具体产品类)就要对应的有一个场务(具体工厂类),他们互相之间有着各自的职责,互不影响,这样可扩展性就变强了。

    5.工厂方法UML类图: (UML图是我用windows自带的paint手工画的,所以可能不是很专业

    C# 工厂方法模式

    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.工厂方法的优点/缺点: 

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • 设计模式(1)单例模式(Singleton) - Fonour

      设计模式(1)单例模式(Singleton) - Fonour

      2017-04-23 12:00

    • ASP.NET Core MVC 源码学习:详解 Action 的激活 - Savorboard

      ASP.NET Core MVC 源码学习:详解 Action 的激活 - Savorboard

      2017-04-14 13:04

    • EntityFramework Core并发深挖详解,一纸长文,你准备好看完了吗? - Jeffcky

      EntityFramework Core并发深挖详解,一纸长文,你准备好看完了吗? -

      2017-04-05 14:03

    • ASP.NET Core MVC 源码学习:详解 Action 的匹配 - Savorboard

      ASP.NET Core MVC 源码学习:详解 Action 的匹配 - Savorboard

      2017-03-30 18:02

    网友点评
    s