简单工厂,抽象工厂,工厂模式三者的对照

简单工厂,抽象工厂,工厂模式三者的对照

做者: TindleWei
博客: http://blog.csdn.net/mennoa(转载请说明出处)
GitHub: https://github.com/TindleWei git

我想你们都熟悉工厂模式,但是要分清简单工厂。抽象工厂。工厂模式可能就没那么easy了。因此我查看了不少资料以及设计模式关于工厂模式的介绍,如下来总结一下。github

前言

简单工厂,抽象工厂。工厂模式都属于建立型模式。设计模式

该模式的特色是抽象了实例化的过程。它们帮助了一个系统独立于怎样建立、组合和表示它的那些对象。markdown

其有两个明显特征:
1. 它们都将关于系统使用哪些详细的类的信息封装了起来。工具


2. 他们隐藏了这些实例是怎样被建立和放在一块儿的。 .net

分类

  • 第一种分法:3种

    这是通常的状况,工厂模式分为三种:设计

    • 简单工厂模式对象

      简单工厂模式的工厂类一般是使用静态方法,经过接收的參数的不一样来返回不一样的对象实例。blog


      不改动代码的话。是没法扩展的。接口

    • 抽象工厂模式

      别名:Virtual Constructor
      提供一个建立一系列相关或相互依赖对象的接口。而无需指定它们详细的类。

      简单说就是将对象的声明和实现分离。

    • 工厂方法模式

      别名:Kit
      定义一个用于建立对象的接口,让子类决定实例化哪个类。简单说使一个类的实例化延迟到其子类。

  • 另一种分法:2种

    依据 GOF 的经典之做 《设计模式》,其将工厂模式分为两种:

    • 工厂方法模式

    • 抽象工厂模式

    而简单工厂模式被纳入 工厂方法模式,看作一种特例。

    简单工厂模式的工厂类一般是使用静态方法。经过接收的參数的不一样来返回不一样的对象实例。

    常常会看到其工厂中依据參数不一样switch。返回不一样的产品。

  • 第三种分法:4种

    另外一种说法,除了上面的三种,还有个 静态工厂模式
    好比项目中的工具类,TextUtil.isEmpty等。类+静态方法

特色

  • 工厂方法模式:

    一个抽象产品类,可以派生出多个详细产品类。


    一个抽象工厂类。可以派生出多个详细工厂类。
    每个详细工厂类仅仅能建立一个详细产品类的实例。

  • 抽象工厂模式:

    多个抽象产品类,每个抽象产品类可以派生出多个详细产品类。


    一个抽象工厂类,可以派生出多个详细工厂类。


    每个详细工厂类可以建立多个详细产品类的实例。

差异

  • 简单工厂 : 用来生产同一等级结构中的随意产品。

    (对于添加新的产品,无能为力)

  • 工厂方法 :用来生产同一等级结构中的固定产品。(支持添加随意产品)

  • 抽象工厂 :用来生产不一样产品族的全部产品。(对于添加新的产品。无能为力;支持添加产品族)

工厂方法模式仅仅有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的详细工厂类仅仅能建立一个详细产品类的实例,而抽象工厂模式可以建立多个

讨论


用一个系统建立的那些对象的类对系统进行參数化有两种常常用法。

一种是生成建立对象的子类,如工厂方法模式。

但假设要改变产品类,就需要建立新的子类。

另外一种对系统进行參数化的方法不少其它的依赖于对象的复合:定义一个新的工厂对象负责建立产品对象。

假设是工厂方法模式。全部的产品都来自于抽象产品这一个父类,经过參数的不一样建立不一样的子类。

而抽象工厂方法,每个分类的产品都有一个该类产品的父类。每类对象分别建立并组合。

一般咱们使用的也是最简单的工厂方法模式。做为一种标准的建立对象的方法。

但是当被实例化的类根本不发生变化或当实例化出现在子类 可以很是easy定义的操做中,如初始化操做,这就并没必要要了。

參考


《设计模式 可复用面向对象软件的基础》 –GOF

http://zyjustin9.iteye.com/blog/2094960

http://lh-kevin.iteye.com/blog/1981574

http://blog.csdn.net/hitwhylz/article/details/40381721

http://blog.csdn.net/jason0539/article/details/23020989

http://blog.csdn.net/jason0539/article/details/23020989

相关文章
相关标签/搜索