1.动机
在软件系统中,经常面临着某个对象的创建工作;由于需求的变化,这个对象经常面临着剧烈的变化,但是他却有着稳定的接口。如何应对这种变化,如何保证依赖该对象的对象不随着需求的变化而变化
2.实现
(1)车接口
我们要实现的类型
package com.example.demo.factory.method;
public interface Car {
/**
* 能跑
*/
void run();
/**
* 能停
*/
void stop();
}
(2)车工厂
生成车的抽象接口
package com.example.demo.factory.method;
public interface CarFactory {
/**
* 制造汽车
* @return 汽车实例
*/
Car createCar();
}
(3)别摸我车实例
package com.example.demo.factory.method.impl;
import com.example.demo.factory.method.Car;
public class BmwCar implements Car {
// 实现
@Override
public void run() {
System.out.println("BWM启动了");
}
@Override
public void stop() {
System.out.println("BMW停止了");
}
}
(4)别摸我车工厂实现
package com.example.demo.factory.method.impl;
import com.example.demo.factory.method.Car;
import com.example.demo.factory.method.CarFactory;
public class BmwCarFactory implements CarFactory {
@Override
public Car createCar() {
return new BmwCar();
}
}
(5)客户端
package com.example.demo.factory.method;
import com.example.demo.factory.method.impl.BmwCarFactory;
public class Main {
public static void main(String[] args) {
// 这个往往可以用配置文件实现0依赖
runCar(new BmwCarFactory());
}
/**
* 这里可以理解为客户端
* @param carFactory 汽车工厂
*/
public static void runCar(CarFactory carFactory){
Car car = carFactory.createCar();
car.run();
}
}
3.要点
- 工厂方法模式主要用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。
- 工厂方法模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展的策略,较好的解决了紧耦合关系
- 工厂方法模式解决的是单个对象的需求变化,而抽象工厂解决的是一系列对象的需求变化,建造者模式解决的是复杂对象的部分需求变化