工厂模式
简单工厂、工厂方法、抽象工厂介绍及差异
1. 简单工厂(Simple Factory)
定义:由一个工厂类根据传入的参数,动态决定创建哪一种产品类的实例。
结构:
- 工厂类(Factory):负责创建所有产品,包含核心创建逻辑
- 抽象产品(Product):产品的公共接口
- 具体产品(ConcreteProduct):工厂创建的具体对象
示例代码(Java):
// 抽象产品
interface Product {
void doSomething();
}
// 具体产品A
class ConcreteProductA implements Product {
public void doSomething() {
System.out.println("产品A功能");
}
}
// 具体产品B
class ConcreteProductB implements Product {
public void doSomething() {
System.out.println("产品B功能");
}
}
// 工厂类
class SimpleFactory {
public static Product createProduct(String type) {
if ("A".equals(type)) {
return new ConcreteProductA();
} else if ("B".equals(type)) {
return new ConcreteProductB();
}
return null;
}
}
优点:简单易实现,将产品创建逻辑集中
缺点:工厂类职责过重,增加新产品需修改工厂类(违反开闭原则)
2. 工厂方法(Factory Method)
定义:定义一个创建对象的接口,但由子类决定实例化哪一个类。工厂方法将对象的实例化延迟到子类。
结构:
- 抽象工厂(Factory):声明工厂方法
- 具体工厂(ConcreteFactory):实现工厂方法,创建具体产品
- 抽象产品(Product)
- 具体产品(ConcreteProduct)
示例代码(Java):
// 抽象产品
interface Product {
void doSomething();
}
// 具体产品A
class ConcreteProductA implements Product {
public void doSomething() {
System.out.println("产品A");
}
}
// 抽象工厂
interface Factory {
Product createProduct();
}
// 具体工厂A
class ConcreteFactoryA implements Factory {
public Product createProduct() {
return new ConcreteProductA();
}
}
优点:符合开闭原则,增加新产品只需增加对应工厂类
缺点:类数量增加,系统复杂度提高
3. 抽象工厂(Abstract Factory)
定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。适用于产品族(多个产品类型)的场景。
结构:
- 抽象工厂(AbstractFactory):声明创建一系列产品的方法
- 具体工厂(ConcreteFactory):实现创建产品族的方法
- 抽象产品(AbstractProduct):多个不同产品类型
- 具体产品(ConcreteProduct)
示例代码(Java):
// 抽象产品A
interface ProductA {
void use();
}
// 抽象产品B
interface ProductB {
void eat();
}
// 具体产品A1
class ProductA1 implements ProductA {
public void use() { System.out.println("A1"); }
}
// 具体产品B1
class ProductB1 implements ProductB {
public void eat() { System.out.println("B1"); }
}
// 抽象工厂
interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}
// 具体工厂1
class ConcreteFactory1 implements AbstractFactory {
public ProductA createProductA() { return new ProductA1(); }
public ProductB createProductB() { return new ProductB1(); }
}
优点:保证产品族内对象一致性,易于交换产品族
缺点:增加新产品类型困难(需修改所有工厂类)
核心差异对比表
| 特性 | 简单工厂 | 工厂方法 | 抽象工厂 |
|---|---|---|---|
| 目的 | 单一产品快速创建 | 单个产品扩展性 | 产品系列(族)的一致性 |
| 产品数量 | 单个产品 | 单个产品 | 多个相关产品 |
| 新增产品 | 改工厂类(if-else) | 加新工厂类 ✅ | 加新工厂类,但若新增产品类型(如床)则需改所有工厂 ❌ |
| 客户端感知 | 知道工厂类和参数 | 知道具体工厂子类 | 知道具体工厂子类和产品族 |
| 设计原则 | 违反开闭原则 | 符合开闭原则 | 对产品族符合开闭,对产品种类扩展不友好 |
| 复杂度 | 低 | 中 | 高 |
选择建议
- 简单工厂:产品类型少、变动小、不需要扩展时
- 工厂方法:产品类型多、经常新增产品、客户端无需关心具体类名时
- 抽象工厂:需要保证多个产品一起使用、产品族频繁更换时(如换皮肤、换数据库)

浙公网安备 33010602011771号