1 工厂模式
在面向对象编程中,当需要创建一个对象时,一般是使用类的构造函数来创建它,这种方式存在一个缺点,每次创建相同对象时需要编写大量重复的代码。
工厂模式是一种常见的创建型设计模式,它将对象的创建过程封装在一个工厂类中,使客户端代码无需关心对象的创建过程,只需要通过工厂类来获取所需的对象。
工厂模式又分为:
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
本文将将详细阐述 简单工厂模式
。
2 简单工厂模式
简单工厂模式(Simple Factory Pattern)
通过一个工厂类来封装对象的创建过程,并根据不同的参数返回不同的产品对象实例。简单工厂模式
的核心思想是将对象的创建过程封装在一个工厂类中,而客户端代码只需要通过调用工厂类的静态方法来获取所需的对象实例。
简单工厂模式中通常使用静态方法来创建对象,这种实现方式具有简单、易用、便捷等特点,所以有时候也被称为 静态方法工厂模式(Static Method Factory Pattern)
。
2.1 应用场景
简单工厂模式
适用于下面的场景:
- 需要创建的对象的类型较少,不会频繁地发生变化。
- 客户端不需要关心对象的创建过程,只需要知道如何使用对象即可。
- 对象的创建过程比较简单,不需要复杂的逻辑。
- 需要对对象的创建进行封装,从而避免客户端直接创建对象造成的耦合度过高。
2.2 模式详细说明
首先看 简单工厂模式
的类图:
从上面的类图,可以知道简单工厂模式包含下面的角色:
(1) IProduct
: 产品的接口定义。
(2) ConcreteProductX
: IProduct
的具体实现类。
(3) ProductFactory
: 简单工厂模式的核心,根据传入的参数,实现创建 IProduct 具体实例的逻辑。
(4) Client
: 客户类,它不会直接依赖 ConcreteProductX
,而是依赖 IProduct
,它使用 ProductFactory
创建 IProduct
的具体实例。
2.3 简单工厂模式的例子
IProduct接口
/**
* IProduct接口定义
*/
interface IProduct {
void operation();
}
ConcreteProductX 具体产品实现类
/**
* 产品A实现类
*/
class ConcreteProductA implements IProduct {
@Override
public void operation() {
System.out.println("This is product A");
}
}
/**
* 产品B实现类
*/
class ConcreteProductB implements IProduct {
@Override
public void operation() {
System.out.println("This is product B");
}
}
/**
* 产品C实现类
*/
class ConcreteProductC implements IProduct {
@Override
public void operation() {
System.out.println("This is product C");
}
}
ProductFactory 产品简单工厂类
/**
* 产品的简单工厂类
*/
class ProductFactory {
public static final int CONCRETE_PRODUCT_A = 1;
public static final int CONCRETE_PRODUCT_B = 2;
public static final int CONCRETE_PRODUCT_C = 3;
public static IProduct createProduct(int productType) {
if (productType == CONCRETE_PRODUCT_A) {
return new ConcreteProductA();
} else if (productType == CONCRETE_PRODUCT_B) {
return new ConcreteProductB();
} else if (productType == CONCRETE_PRODUCT_C) {
return new ConcreteProductC();
}
return null;
}
}
Client 使用简单工厂生成产品的客户类
public class Client {
public static void main(String[] args) throws Exception {
List<IProduct> productList = new ArrayList<>();
productList.add(ProductFactory.createProduct(ProductFactory.CONCRETE_PRODUCT_A));
productList.add(ProductFactory.createProduct(ProductFactory.CONCRETE_PRODUCT_B));
productList.add(ProductFactory.createProduct(ProductFactory.CONCRETE_PRODUCT_C));
for (IProduct product : productList) {
product.operation();
}
}
}
运行程序会输出:
This is product A
This is product B
This is product C