HTML5技术

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

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

优点: 缺点:需要Creator和相应的子类作为factory method的载体,如果应用模型确实需要creator和子类存在,则很好;否则的话,需要增加一个类层次。(不过说这个缺点好像有点吹毛求疵了) v 抽象工厂模式 1.介绍:

  • 优点:
  • 缺点:需要Creator和相应的子类作为factory method的载体,如果应用模型确实需要creator和子类存在,则很好;否则的话,需要增加一个类层次。(不过说这个缺点好像有点吹毛求疵了)
  • v抽象工厂模式

    1.介绍: 

    抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。

    2.定义: 

    为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

    3.模拟场景: 

    我们还是继续范·迪塞尔的例子,往往这些大牌生活中经常参加一些活动,或是商务活动或是公益活动。不管参加什么活动,加上老范(范·迪塞尔名字太长,以下文中简称老范)的知名度,他的车肯定不少,可能光跑车或者光越野车就有多辆。比如说有跑车(多辆,跑车系列的具体产品)、越野车(多辆,越野车系列的具体产品)、两箱车(多辆,两箱车系列的具体产品)。可能很多大牌明星都是如此的。假设老范家里,某一个车库(具体工厂)只存放某一系列的车(比如说跑车车库只存放跑车一系列具体的产品),每次要某一辆跑车的时候肯定要从这个跑车车库里开出来。用了OO(Object Oriented,面向对象)的思想去理解,所有的车库(具体工厂)都是车库类(抽象工厂)的某一个,而每一辆车又包括具体的开车时候所背的包(某一具体产品。包是也是放在车库里的,不同的车搭配不同的包,我们把车和车对应的背包称作出去参加活动的装备),这些具体的包其实也都是背包(抽象产品),具体的车其实也都是车(另一个抽象产品)。

    4.场景分析: 

    上面的场景可能有点稀里糊涂的,但是用OO的思想结合前面的简单工厂和工厂方法的思路去理解的话,也好理解。

    下面让我们来捋一捋这个思路:

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

    6.代码演示: 

    抽象工厂代码: 

    namespace CNBlogs.DesignPattern.Common { 抽象工厂类 AbstractEquipment { 抽象方法: 创建一辆车 AbstractCar CreateCar(); 抽象方法: 创建背包 AbstractBackpack CreateBackpack(); } }

    抽象产品代码: 

    namespace CNBlogs.DesignPattern.Common { 抽象产品: 车抽象类 AbstractCar { 车的类型属性 Type { get; } 车的颜色属性 Color { get; } } 抽象产品: 背包抽象类 AbstractBackpack { 包的类型属性 Type { get; } 包的颜色属性 Color { get; } } }

    具体工厂代码: 

    namespace CNBlogs.DesignPattern.Common { 运动装备 SportEquipment : AbstractEquipment { public override AbstractCar CreateCar() { return new SportCar(); } public override AbstractBackpack CreateBackpack() { return new SportBackpack(); } } 越野装备 这里就不添加了,同运动装备一个原理,demo里只演示一个,实际项目中可以按需添加 public class JeepEquipment : AbstractEquipment //{ // public override AbstractCar CreateCar() // { // return new JeeptCar(); // } // public override AbstractBackpack CreateBackpack() // { // return new JeepBackpack(); // } //} }

    具体产品代码: 

     

    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

    网友点评
    (