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

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

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

我想大家都熟悉工厂模式,但是要分清简单工厂,抽象工厂,工厂模式可能就没那么容易了。所以我查看了许多资料以及设计模式关于工厂模式的介绍,下面来总结一下。

前言

简单工厂,抽象工厂,工厂模式都属于创建型模式。

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

其有两个明显特征:
1. 它们都将关于系统使用哪些具体的类的信息封装了起来。
2. 他们隐藏了这些实例是如何被创建和放在一起的。

分类

  • 第一种分法:3种

    这是一般的情况,工厂模式分为三种:

    • 简单工厂模式

      简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。
      不修改代码的话,是无法扩展的。

    • 抽象工厂模式

      别名:Virtual Constructor
      提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。简单说就是将对象的声明和实现分离。

    • 工厂方法模式

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

  • 第二种分法:2种

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

    • 工厂方法模式

    • 抽象工厂模式

    而简单工厂模式被归入 工厂方法模式,看做一种特例。简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。经常会看到其工厂中根据参数不同switch,返回不同的产品。

  • 第三种分法:4种

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

特点

  • 工厂方法模式:

    一个抽象产品类,可以派生出多个具体产品类。
    一个抽象工厂类,可以派生出多个具体工厂类。
    每个具体工厂类只能创建一个具体产品类的实例。

  • 抽象工厂模式:

    多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
    一个抽象工厂类,可以派生出多个具体工厂类。
    每个具体工厂类可以创建多个具体产品类的实例。

区别

  • 简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)

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

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

工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个

讨论


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

一种是生成创建对象的子类,如工厂方法模式。但如果要改变产品类,就需要创建新的子类。

另一种对系统进行参数化的方法更多的依赖于对象的复合:定义一个新的工厂对象负责创建产品对象。

如果是工厂方法模式,所有的产品都来自于抽象产品这一个父类,通过参数的不同创建不同的子类。

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

通常我们使用的也是最简单的工厂方法模式,作为一种标准的创建对象的方法。

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

参考


《设计模式 可复用面向对象软件的基础》 –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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值