工厂模式应用场景
对可扩展的模块,不会动以前的代码,不会在以前的代码中出现if else ,不打破设计模式的单一职责原则和开闭原则。
所以说,如果有新的扩展,会继承抽象类,重新创建新的工厂类
工厂方法模式
必备要素:
1、具有抽象的工厂基类(该类用abstract修饰)
将该领域的行为(方法)抽象出来,abstract 类来为行为创建了一个模板。规范其流程,
主流程中有N个子流程。其中一部分个性化的子流程方法用abstract修饰,子类实现。
2、具有抽象工厂基类的派生工厂类
必须实现父类的抽象方法,可直接继承父类的行为(方法)模板。
3、具有公共父类Moudle类
将该领域的属性(字段)汇总在一起。普通的class类。
3、继承公共父类Moudle类的子类。
将个性化的属性(字段)放在子类中
场景案例:
根据车的型号,购买汽车。small就买小汽车,big就买大汽车。
以后还会有自行车、电动车、摩托车的扩展。
思考:
小汽车和大汽车。同属于汽车类。 汽车、自行车、摩托车共同属于交通工具
将这些共有的属性抽象成一个 共同的基类。Vehicle(交通工具类),然后在派生类里面实现个性化
工厂分支:
抽象工厂类VehicleFactory ,子类:CarFactory.如果以后有扩展 就继承VecicleFactory类即可。
比如自行车工厂类:BikeFactory extends VehicleFactory
/**
* 工厂方法模式:
* 分2支:
* 1、工厂:父工厂类中声明abstract方法,子类实现abstract方法,调用父类的业务方法
* 2、类:子类继承父类,因为子类的工厂需要返回父类。
* 符合单一职责原则、符合开闭原则
*
* Q:想根据型型号买一辆小汽车
*
* 如果以后还想要再新增自行车。就创建自行车的BikeFactory,自行车的moudle类
*
* 工厂+模板=工厂方法模式
*
* */
public abstract class VehicleFactory {
/**
* 只依赖父类。Vehicle,根据Java的特性,动态解析。可以将子类向上塑型到基类
*
*
* */
public abstract Vehicle createVehicle(String size);
/**
* 不能有任何子类的信息。
* 依赖倒置原则。
* VehicleFactory 只能依赖Vehicle类。不能依赖Car 和Bike
*
* 交通工具共有的行为 抽象到父类工厂中
* */
public Vehicle buyVehicle(String size,String color){
Vehicle vehicle=createVehicle(size);
vehicle.setColor(color);
vehicle.setSize(size);
doSomething();
return vehicle;
}
public void doSomething(){
System.out.println("vehicle do something");
}
}
public class CarFactory extends VehicleFactory{
@Override
public Vehicle createVehicle(String size) {
if("small".equals(size)){
return new SmallCar();
}else {
return new BigCar();
}
}
}
Moudle 类。基类:Vehicle ,Car类:BigCar,SmallCar
如果以后要扩展,例如自行车:Bike类:BigBike,SmallBike
public class Vehicle {
String size;
String color;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
}
public class BigCar extends Vehicle {
public BigCar(){
System.out.println("this is bigCar");
}
}
public class SmallCar extends Vehicle {
public SmallCar(){
System.out.println("this is smallCar");
}
}