3、工厂模式(工厂方法模式)

工厂模式应用场景

对可扩展的模块,不会动以前的代码,不会在以前的代码中出现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");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值