工厂方法模式(Factory Method)
定义
定义一个创建对象的接口(Abstract Factory),但由子类(Concrete Factory)决定要实例化的类是哪一个。
使用场景
首先当然是在你需要new一个类的对象的时候,此时各种状况出现啦:
- 你不想直接new这个类的对象,怕以后这个类改变的时候你需要回来改代码,而此时依赖这个类的地方已经到处都是了。
- 这个类的对象构建过程非常复杂,你不愿意将这么复杂的构建过程一遍又一遍的写在需要用到此对象的地方。
- 这个类的对象在构建过程中依赖了很多其他的类,而你无法在调用的地方提供。
主要角色
- 抽象产品 Abstract Product
- 具体产品 Concrete Product
- 抽象工厂 Abstract Factory
- 具体工厂 Concrete Factory
类图
示例代码
java
@Data
public abstract class Computer {
protected String brand;
protected String operationSystem;
}
java
public class Computer4Mac extends Computer {
}
java
public class Computer4Mi extends Computer {
}
java
public interface ComputerFactory {
Computer makeComputer();
}
java
public class ComputerFactory4Mac implements ComputerFactory {
@Override
public Computer makeComputer() {
Computer4Mac computer = new Computer4Mac();
// 模拟复杂的初始化过程
computer.setBrand("Mac");
computer.setOperationSystem("Mac操作系统");
return computer;
}
}
java
public class ComputerFactory4Mi implements ComputerFactory {
@Override
public Computer makeComputer() {
Computer4Mi computer = new Computer4Mi();
// 模拟复杂的初始化过程
computer.setBrand("小米");
computer.setOperationSystem("小米操作系统");
return computer;
}
}
java
public class Client {
public static void main(String[] args) {
//生产Mac电脑
ComputerFactory macFactory=new ComputerFactory4Mac();
Computer computer4Mac = macFactory.makeComputer();
System.out.println("computer4Mac = " + computer4Mac);
//生产小米电脑
ComputerFactory miFactory=new ComputerFactory4Mi();
Computer computer4mi = miFactory.makeComputer();
System.out.println("computer4mi = " + computer4mi);
}
}