Factory Method
延迟类的实例化(支持变化,延迟到子类),解耦(new 后面的具体类)
① 创建基类,定义工厂方法所创建的对象的接口(这里生产电脑系统Linux和Computer)
/**
* 工厂基类
*/
public abstract class SystemProductFactory {
// 工厂方法
abstract ComputerSystem createComputerSystem();
}
② 创建LinuxFactory,生产Linux的工厂
public class LinuxFactory extends SystemProductFactory{
@Override
public ComputerSystem createComputerSystem() {
return new Linux();
}
}
③ 创建具体类Linux
public class Linux extends ComputerSystem {
@Override
void run() {
System.out.println("Linux");
}
}
④ 真正实现依赖倒置原则
public class Main {
private SystemProductFactory systemProductFactory;
// 构造方法,传入一个工厂对象
public Main(SystemProductFactory systemProductFactory){
this.systemProductFactory = systemProductFactory;
}
public void run(){
// 通过多态的形式接收,且通过接口的方式获取工厂,不会造成细节依赖,实现依赖倒置原则
ComputerSystem system = systemProductFactory.createComputerSystem();
system.run();
}
}
⑤ 测试
public static void main(String[] args) {
SystemProductFactory factory = new LinuxFactory();
Main main = new Main(factory);
main.run();
}
注意:Main(我不在乎别人,只在乎自己在编译过程中没有new的依赖。new的依赖不能消除,只能转换)
让Main依赖稳定的,而不是依赖变化的
场景:Factory Method模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱
优点:通过面向对象的手法(多态),将所要创建的具体对象工作延迟到子类(继承),从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合的关系。
缺点:解决 " 单个对象 " 的需求变化。但是在于要求创建方法/参数相同。