前言
工厂方法模式适用于以下场景:
当需要创建多个具有相似功能的对象时
,可以使用工厂方法模式来统一创建这些对象。
例如,一个图片处理软件需要支持多种格式的图片导入,可以使用工厂方法模式来创建不同格式图片导入器的实例。
当对象的创建过程比较复杂,需要进行一系列的初始化操作时
,可以使用工厂方法模式来封装这些复杂的创建过程。
例如,一个电子商务网站需要生成订单时,订单的创建过程可能涉及到一系列的验证和初始化操作,可以使用工厂方法模式来封装这些复杂的创建过程。
当需要动态地决定创建哪种对象时
,可以使用工厂方法模式。
例如,一个游戏中的角色选择界面需要根据用户选择的角色类型来创建对应的角色对象,可以使用工厂方法模式来动态地创建角色对象。
当需要为不同的客户端提供不同的实现时
,可以使用工厂方法模式。
例如,一个跨平台的应用程序需要在不同的操作系统上提供不同的实现,可以使用工厂方法模式来分别创建不同操作系统下的实现类。
当需要灵活地扩展和修改对象的创建过程时
,可以使用工厂方法模式。
工厂方法模式通过定义一个抽象的工厂接口和多个具体的工厂实现类,可以很方便地新增和修改工厂实现类,从而实现对象的灵活创建和切换。
1 介绍
工厂方法模式(Factory Method Pattern)也叫虚拟构造器(Virtual Constructor)模式
或者叫 多态工厂(Polymorphic Factory)模式
,是一种 创建型设计模式,它定义了一个创建对象的接口,但是由子类决定实例化哪个类。工厂方法模式将对象的实例化延迟到子类中进行,从而解耦了对象的创建和使用。
工厂方法模式的主要角色如下:
-
抽象产品
(Product):定义了产品的接口,具体产品需要实现这个接口。 -
具体产品
(Concrete Product):实现了抽象产品接口的具体类。 -
抽象工厂
(Factory):定义了创建产品的接口,具体工厂需要实现这个接口。 -
具体工厂
(Concrete Factory):实现了抽象工厂接口,具体工厂负责创建具体产品的实例。
-
核心思想
工厂方法模式的核心思想是将对象的创建过程封装在具体工厂内部,客户端只需要知道抽象工厂和抽象产品的存在,无需关心具体的创建细节。这样做的好处是可以轻松地扩展产品的种类,只需要新增具体产品和对应的具体工厂即可。 -
优/缺点
-
工厂方法模式的优点包括:
-
符合开闭原则:新增产品时无需修改已有的代码,只需要新增具体产品和具体工厂即可。
-
可以更加灵活地创建对象:具体工厂可以根据需要动态地决定创建哪个具体产品。
-
降低客户端与具体产品的耦合度:客户端只需要依赖抽象产品和抽象工厂,无需关心具体的实现。
-
-
工厂方法模式的缺点包括:
-
引入了额外的类和接口,增加了系统的复杂度。
-
客户端需要知道抽象工厂和抽象产品的存在,增加了学习和理解的成本。
-
-
工厂方法模式是一种简单而有效的创建对象的方式,可以帮助我们实现松耦合的代码结构,并且方便扩展和维护。
2 模式结构图
3 代码实现
下面是一个简单的Java实现工厂方法模式的例子,其中包括加减乘除四种运算的代码:
首先,我们需要定义一个接口运算符方法:
public interface Operator {
double getResult(double num1, double num2);
}
然后,我们可以实现四种不同的运算操作:
public class AddOperator implements Operator {
@Override
public double getResult(double num1, double num2) {
return num1 + num2;
}
}
public class SubtractOperator implements Operator {
@Override
public double getResult(double num1, double num2) {
return num1 - num2;
}
}
public class MultiplyOperator implements Operator {
@Override
public double getResult(double num1, double num2) {
return num1 * num2;
}
}
public class DivideOperator implements Operator {
@Override
public double getResult(double num1, double num2) {
if (num2 == 0) {
throw new IllegalArgumentException("除数不能为0");
}
return num1 / num2;
}
}
接下来,我们需要定义一个工厂类,根据运算符来创建相应的运算对象:
public class OperatorFactory {
public static Operator createOperator(String operator) {
switch (operator) {
case "+":
return new AddOperator();
case "-":
return new SubtractOperator();
case "*":
return new MultiplyOperator();
case "/":
return new DivideOperator();
default:
throw new IllegalArgumentException("不支持的运算符");
}
}
}
最后,我们可以使用工厂方法来进行计算:
public static void main(String[] args) {
double num1 = 10;
double num2 = 5;
Operator addOperator = OperatorFactory.createOperator("+");
double result = addOperator.getResult(num1, num2);
System.out.println(result); // 输出15.0
Operator subtractOperator = OperatorFactory.createOperator("-");
result = subtractOperator.getResult(num1, num2);
System.out.println(result); // 输出5.0
Operator multiplyOperator = OperatorFactory.createOperator("*");
result = multiplyOperator.getResult(num1, num2);
System.out.println(result); // 输出50.0
Operator divideOperator = OperatorFactory.createOperator("/");
result = divideOperator.getResult(num1, num2);
System.out.println(result); // 输出2.0
}
4 对比
简单工厂模式与工厂方法模式的主要区别:
简单工厂模式相关技术链接
- 简单工厂模式只有一个工厂类,通过传入参数来决定创建哪一种具体产品类的对象。工厂方法模式每个具体产品类都对应一个工厂类。
- 简单工厂模式的优点是客户端只需知道工厂类即可,无需关心具体的产品类。缺点是如果需要新增产品类,需要修改工厂类的代码,违反了开闭原则。工厂方法模式符合开闭原则,新增产品类则新增对应的工厂类即可。
- 工厂方法模式更符合单一职责原则,每个具体产品类都有一个对应的工厂类负责创建。简单工厂模式可能违背单一职责原则,一个工厂类负责创建多个产品类的对象。
简单来说,简单工厂模式适用于创建的对象较少且变化不频繁的情况,而工厂方法模式适用于创建的对象较多且可能经常变化的情况。