一,介绍
简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它专门定义一个类来负责创建其他类的实例。这种模式允许客户端通过单一的接口创建多种类型的对象,而无需指定具体的类。简单工厂模式的核心是一个工厂类,它包含了必要的逻辑来创建产品线中的产品对象。这些产品对象通常都具有共同的父类或接口。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式。
二,简单工厂模式结构组成
抽象产品(Product)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。可以包含一些公共代码。
具体产品(Concrete Product)角色:是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
工厂(Creator)角色:工厂类是简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。在工厂类中提供一个创建产品的工厂方法,该方法可以根据所传入的参数不同创建不同的具体产品对象。客户端只需调用工厂类的工厂方法并传入相应的参数即可得到一个产品对象。
UML类图如下所示:
三,简单工厂模式优缺点
优点
- 简化了客户端代码,因为客户端不需要知道具体产品的创建细节。把一些初始化的工作放在具体产品中,减少创建过程中一些重复代码,比如Java中,new完对象,然后set属性值。
- 提供了隐藏具体产品类的实现细节的能力,增强了系统的封装性。
- 通过控制产品的创建过程,可以防止随意创建对象的情况发生。
- 客户端只要使用对象就好,不需要关心对象的创建。
缺点
- 工厂类可能变得庞大和复杂,尤其是当产品线很长时。
- 增加了系统的类数量,可能导致理解和维护上的困难。
- 不符合开闭原则,即当添加新产品时需要修改原有的工厂类代码。
四,简单工厂模式使用场景
简单工厂模式适用于以下场景:
- 当工厂类负责创建的对象比较少时。
- 客户端只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心。
- 系统中的具体产品类较少,且不会频繁变化。
五,示例代码
// 抽象产品接口
interface Product {
void operation();
}
// 具体产品类A
class ConcreteProductA implements Product {
@Override
public void operation() {
System.out.println("Using Product A.");
}
}
// 具体产品类B
class ConcreteProductB implements Product {
@Override
public void operation() {
System.out.println("Using Product B.");
}
}
// 简单工厂类
class SimpleFactory {
public static Product createProduct(String productType) {
switch (productType) {
case "A":
ConcreteProductA concreteProductA = new ConcreteProductA();
//一些初始化操作
return concreteProductA;
case "B":
return new ConcreteProductB();
default:
throw new IllegalArgumentException("Unknown product type.");
}
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Product productA = SimpleFactory.createProduct("A");
productA.operation();
Product productB = SimpleFactory.createProduct("B");
productB.operation();
}
}