( 五 )、设计模式 之 简单工厂模式(SimpleFactory)
( 五 )、设计模式 之 简单工厂模式(SimpleFactory)
1、简介
定义:简单工厂模式提供了一个创建对象实例的功能,而无需关心其具体的实现。该工厂用于选择接口或抽象的具体实现,返给调用方。
这使得你可以在程序运行时动态地创建对象,如果一个类有多个子类(或者一个接口有多个实现),那么使用工厂模式可以使得代码更加简洁,易于维护。
2、优缺点
优点:
- 代码简洁:简单工厂模式将对象的创建和使用分离,使得代码更加清晰简洁,易于维护。
- 单一职责:工厂类只负责创建对象,没有其他的职责,这使得代码更加单一,职责明确。
缺点:
-
违反了“开闭原则”:在简单工厂模式中,如果要增加新的产品类,就需要修改工厂类,这违反了“开闭原则”。
- 简单工厂模式使用了 static 工厂方法,造成工厂角色无法形成基于继承的等级结构。
3、应用场景
何时选用简单工厂模式?
- 如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,那么可以选用简单工厂,让客户端通过工厂来获取相应的接口,而无须关心具体的实现。
- 如果想要把对外创建对象的职责集中管理和控制,可以选用简单工厂,一个简单工厂可以创建很多的、不相关的对象,可以把对外创建对象的职责集中到一个简单工厂来,
从而实现集中管理和控制。
- 对于产品种类相对较少的情况,考虑使用简单工厂模式。使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关心如何创建对象的逻辑,可以很方便地创建所需产品。
案例
举一个例子,假设有一个订单支付功能,有两种支付方式:支付宝支付和微信支付。用户在客户端进行支付时,需要从这两种支付方式中选取一种,进行支付操作。在这种情况下,可以创建一个简单工厂模式来决定创建出哪一种支付方式的实例。
4、模式的结构与实现
简单工厂模式的主要角色如下:
- 简单工厂(SimpleFactory):是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
- 抽象产品(Product):是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口。
- 具体产品(ConcreteProduct):是简单工厂模式的创建目标。
5、简单工厂模式代码示例:
public class Client {
public static void main(String[] args) {
}
//抽象产品
public interface Product {
void show();
}
//具体产品:ProductA
static class ConcreteProduct1 implements Product {
public void show() {
System.out.println("具体产品1显示...");
}
}
//具体产品:ProductB
static class ConcreteProduct2 implements Product {
public void show() {
System.out.println("具体产品2显示...");
}
}
final class Const {
static final int PRODUCT_A = 0;
static final int PRODUCT_B = 1;
static final int PRODUCT_C = 2;
}
static class SimpleFactory {
public static Product makeProduct(int kind) {
switch (kind) {
case Const.PRODUCT_A:
return new ConcreteProduct1();
case Const.PRODUCT_B:
return new ConcreteProduct2();
}
return null;
}
}
}