概述
有三种创建型的工厂相关的设计模式:
- 简单工厂
- 工厂方法
- 抽象工厂
主要有两种区分:
- 三种方式从上到下逐步抽象,并且更具一般性。
- 简单工厂可以视为工厂方法的一种特例。
使用情况:
- 编码时不能预见需要创建哪种类的实例。
- 系统不依赖于产品类实例如何被创建、组合和表达的细节。
简单工厂(Simple Factory)
这个模式本身很简单,使用在业务较简单,具体产品很少扩展的情况下。
角色
- 工厂类角色——模式核心,根据逻辑不同,产生具体的工厂产品。
- 抽象产品角色——具体产品父类或接口,一般作为工厂的返回(以抽象方式返回)。
- 具体产品角色——要创建的具体产品。
/*** 简单工厂 -> 工厂抽象** @author Jinhua* @date 2021/2/25上午12:23*/public class CpuFactory {/*** 简单判断,产生具体产品,但返回父类抽象** @param type 判断逻辑依据* @return 返回父类产品抽象*/public static Cpu createCpu(int type) {if (type == 1) {return new IntelCpu();} else {return new AppleCpu();}}}
工厂方法(Factory Method)——对工厂做抽象
意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。
场景
汽车作为产品,有奔驰和宝马的实际产品,它们的生产从奔驰工厂和宝马工厂来。
结构
对比分析
- 相对于简单工厂,工厂方法模式对工厂做了抽象,工厂的实现中生成具体的产品。
- 与抽象工厂类比,抽象工厂工厂如其名字一样,在工厂上做了抽象,每个实际工厂产生的一系列产品做了定义。
抽象工厂(Abstract Factory)——产生一系列产品
意图
提供一个接口以创建一系列相关或相互依赖的对象,而无须指定它们具体的类。
场景
组装电脑需要CPU和内存RAM,对于Windows和Mac(产品集成)来说,所需的是两个不同的系列CPU和RAM产品。
- Windows需要Windows系列的CPU和RAM
- Mac需要Mac系列的CPU和RAM。
结构
角色
- 抽象产品
- 具体产品
- 抽象工厂
- 具体工厂
适用性
- 系统要独立于它的产品的创建、组合和表示;
- 系统要由多个产品系列中的一个来配置;
- 强调一系列相关的产品对象的设计以便进行联合使用;
- 提供一个产品类库,但只是要它的接口而不是实现。
效果
优势
- 分离了具体的类
客户通过抽象接口操作实例。
产品的类名在工厂的实现中被隔离。 - 使得易于交换产品系列
一个具体工厂类在一个应用中仅在初始化的时候出现一次,所以改变具体工厂就能实现使用不同的产品。 - 有利于产品的一致性
一个应用只能使用同一个系列中的对象。抽象工厂很容易实现这点。
劣势
- 难以支持新种类的产品
AbstractFactory确定了可以被创建的产品集合,扩展新产品必须保证其所有子类都扩展。
实现细节
- 工厂作为单例模式(Singleton)
- 创建产品
- 定义可扩展的工厂
