一、简介
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它通过定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。这个模式解决了在代码中使用具体类(硬编码)的问题,提高了代码的可扩展性和维护性。
二、组成部分
- 抽象产品(Product):定义产品的接口。
- 具体产品(Concrete Product):实现产品接口的具体类。
- 抽象工厂(Creator):声明一个工厂方法,该方法返回一个产品类型的对象。
- 具体工厂(Concrete Creator):实现创建产品对象的工厂方法。
三、UML类图
+----------------+
| Factory |
+----------------+
| +CreateProduct()|
+----------------+
^
|
+------------------+
| ConcreteFactory |
+------------------+
| +CreateProduct() |
+------------------+
|
+---------------------+
| Product |
+---------------------+
/ \
+---------+ +---------+
| ConcreteProductA | ConcreteProductB |
+----------------+ +----------------+
四、 代码示例
假设我们有一个产品接口Product
和两个具体产品类 ConcreteProductA
和 ConcreteProductB
。我们还需要一个抽象工厂 Factory
和两个具体工厂 ProductAFactory
和 ProductBFactory
。
抽象产品接口
public interface Product {
void use();
}
具体产品实现类
每一个具体的产品类中定义了该具体的产品的使用方式。
public class ConcreteProductA implements Product {
@Override
public void use() {
System.out.println("Using ConcreteProductA");
}
}
public class ConcreteProductB implements Product {
@Override
public void use() {
System.out.println("Using ConcreteProductB");
}
}
抽象工厂
统一定义创建产品的类!
public interface Factory {
public Product createProduct();
}
具体工厂
每一个具体的工厂创建该工厂对应的具体的产品!
public class ProductAFactory extends Creator {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
public class ProductBFactory extends Creator {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
使用
public class Main {
public static void main(String[] args) {
Factory AFactory = new ProductAFactory();
Product productA = AFactory.createProduct();
productA.use(); // 输出:Using ConcreteProductA
Factory BFactory = new ProductBFactory();
Product productB = BFactory.createProduct();
productB.use(); // 输出:Using ConcreteProductB
}
}
总结
工厂方法模式通过引入一个抽象工厂来创建产品对象,避免创建者与具体的产品逻辑耦合、满足单一职责,每一个业务逻辑实现都在所属自己的类中完成、满足开闭原则,无需更改使用调用方就可以在程序中引入新的产品类型。