GoF工厂模式
GoF 设计模式概述
GoF(Gang of Four),四⼈组。编写了十分经典的《设计模式》一书,阐述了23种设计模式。
《Design Patterns: Elements of Reusable Object-Oriented Software》(即《设计模式》⼀ 书),1995年由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著。这⼏位作 者常被称为"四⼈组(Gang of Four)"。
设计模式:⼀种可以被重复利⽤的解决⽅案。
- 平常所说的 GoF 设计模式就是指这23种设计模式。
除了 GoF 设计模式外,还有其他的设计模式,如 javaEE 设计模式(包含 DAO、MVC等)。
GoF 23种设计模式可分为三大类:
- 创建型(5个):解决对象创建问题。
- 单例模式
- 工厂方法模式
- 抽象工厂模式
- 建造者模式
- 原型模式
- 结构型(7个):一些类或对象组合在一起的经典结构。
- 代理模式
- 装饰模式
- 适配器模式
- 组合模式
- 享元模式
- 外观模式
- 桥接模式
- 行为型(11个):解决类或对象之间的交互问题。
- 策略模式
- 模板方法模式
- 责任链模式
- 观察者模式
- 迭代子模式
- 命令模式
- 备忘录模式
- 状态模式
- 访问者模式
- 中介者模式
- 解释器模式
工厂模式
Spring 底层使用了大量的工厂模式,学习好工厂模式有助于加深对Spring的理解。
工厂模式通常有三种形态:
简单工厂模式(Simple Factory):不属于23种设计模式之⼀。
简单工厂模式⼜叫做:静态工厂方法模式。
简单工厂模式是工厂⽅法模式的⼀种特殊实现。
工厂⽅法模式(Factory Method):是23种设计模式之⼀。
抽象工厂模式(Abstract Factory):是23种设计模式之⼀。
简单工厂模式
简单⼯⼚模式(Simple Factory)的⻆⾊包括三个:
- 抽象产品 ⻆⾊
- 具体产品 ⻆⾊
- ⼯⼚类 ⻆⾊
工厂类包揽产出具体产品的逻辑,但逻辑是写死的,不符合OCP原则,但是它的类关系简单,没有抽象工厂的角色(工厂方法中多一个抽象工厂),故称为简单工厂模式、静态工厂方法模式。
简单工厂模式的优点:
- 客户端程序不需要关⼼对象的创建细节,需要哪个对象时,只需要向⼯⼚索要即可,初步实现了责任的分离。
- 实现了⽣产和消费分离。 客户端只负责“消费”,⼯⼚负责“⽣产”。
简单工厂模式的缺点:
- ⼯⼚类集中了所有产品的创造逻辑,形成⼀个⽆所不知的全能类,有⼈把它叫做上帝类。显然⼯⼚类⾮常关键,不能出问题,⼀旦出问题,整个系统瘫痪。 (产品与这个工厂类高度耦合)
- 不符合OCP开闭原则,在进⾏系统扩展时,需要修改⼯⼚类。
- Spring 中的 BeanFactory 就使⽤了简单⼯⼚模式。
工厂方法模式
工厂⽅法模式既保留了简单⼯⼚模式的优点,同时⼜解决了简单工厂模式的缺点。
工厂⽅法模式(Factory Method)的⻆⾊包括:
- 抽象产品 ⻆⾊
- 具体产品 ⻆⾊
- 抽象工厂 角色
- 具体⼯⼚ ⻆⾊
抽象工厂中定义了工厂的共有方法,面向抽象编程,具体的工厂只需要实现抽象工厂中的方法即可,故称工厂方法模式。
把具体产品的生产交由对应的具体工厂来完成,不再有上帝类的存在,要增加新产品只需要添加具体的工厂即可,符合OCP原则。
⼯⼚⽅法模式的优点:
- ⼀个调⽤者想创建⼀个对象,只要知道其名称就可以了。
- 扩展性⾼,如果想增加⼀个产品,只要扩展⼀个⼯⼚类就可以。
- 屏蔽产品的具体实现,调⽤者只关⼼产品的接⼝。
⼯⼚⽅法模式的缺点:
- 每次增加⼀个产品时,都需要增加⼀个具体类和对象实现⼯⼚,使得系统中类的个数成倍增加,在 ⼀定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。(类爆炸)
抽象工厂模式
抽象⼯⼚模式相对于⼯⼚⽅法模式来说,就是⼯⼚⽅法模式是针对⼀个产品系列的,⽽抽象⼯⼚模式是针对多个产品系列的,即**⼯⼚⽅法模式是⼀个产品系列⼀个⼯⼚类**,⽽抽象⼯⼚模式是多个产品系列⼀ 个⼯⼚类。
抽象⼯⼚模式特点:抽象⼯⼚模式是所有形态的⼯⼚模式中最为抽象和最具⼀般性的⼀种形态。
抽象⼯⼚模式是指当有多个抽象⻆⾊时,使⽤的⼀种⼯⼚模式。
抽象⼯⼚模式可以向客户端提供⼀个接⼝,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。它有多个抽象产品类,每个抽象产品类可以派⽣出多个具体产品类,⼀个抽象⼯⼚类,可以派⽣出多个具体⼯⼚类,每个具体⼯⼚类 可以创建多个具体产品类的实例。
抽象⼯⼚中包含4个⻆⾊:
- 抽象⼯⼚⻆⾊
- 具体⼯⼚⻆⾊
- 抽象产品⻆⾊
- 具体产品⻆⾊
不同于工厂方法模式,这里的*抽象⼯⼚*是对各具体工厂的方法整合,使用抽象工厂提供对外一致的、包含多个产品族的工厂方法。具体工厂实现这个抽象工厂中的方法,但只负责自己产品族的实现,对其他产品族的实现无需在意,直接返回null即可。
抽象工厂示例:

- AbstractFactory 抽离、整合各产品工厂的方法,成为各各工厂的共同抽象。
- WeaponFactory 只负责 Weapon 产品族的生产,getFruit 直接返回null即可。
- 可以搭配简单工厂模式,实现对具体工厂创建的隐藏。
抽象⼯⼚模式的优点:
- 当⼀个产品族中的多个对象被设计成⼀起⼯作时,它能保证客户端始终只使⽤同⼀个产品族 中的对象。
抽象⼯⼚模式的缺点:
- 产品族扩展⾮常困难,要增加⼀个系列的某⼀产品,既要在AbstractFactory ⾥加代码,⼜要在各个具体工厂⾥⾯加代码。
