5.建造者模式(生成器模式)

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

 建造者模式的使用场景

1)相同的方法,不同的执行顺序,产生不同的事件结果时,可以使用建造者模式。

2)多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不想同时,可以使用建造者模式。

3)产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这时候可以使用建造者模式。

4)在对象创建过程中会使用到系统的一些其他对象,这些对象在产品对象的创建过程中不易得到,也可以采用建造者模式封装该对象的创建过程。这种场景只能是一个补偿的方法,因为一个对象不容易获得,而在设计阶段竟然没有发现,而要通过设计这模式来柔化创建过程,本身设计已经出问题了。

为什么使用建造者模式

1)封装性:使用建造者模式可以是客户端不必知道产品内部组成的细节。

2)建造者独立,容易扩展:BenzBuilder和BMWBuilder是相互独立的,对系统扩展非常有利。

3)便于控制细节风险:由于具体的建造者是独立的,因此可以对建造者过程逐步细化,而不对其他的模块产生任何影响。

案例

 

 最开始创建的抽象类:HouseModel

/**
 * @author wuyimin
 * @create 2021-07-25 21:15
 * @description 房屋的模型,抽象类
 */
public abstract class HouseModel {
    //数组,通过这个数组的顺序内容来决定执行什么操作
    private ArrayList<String> arrayList=new ArrayList<>();
    //起围墙
    public abstract void wall();
    //盖房顶
    public abstract void roof();
    //增加屋内装饰
    public abstract void add();
    //增加灯光效果
    public abstract void light();
    public void buildHouse(){
        for (int i = 0; i < arrayList.size(); i++) {
            String s = arrayList.get(i);
            if(s.equals("wall")){
                wall();
            }else if(s.equals("roof")){
                roof();
            }else if(s.equals("add")){
                add();
            }else if(s.equals("light")){
                light();
            }
        }
    }

    public ArrayList<String> getArrayList() {
        return arrayList;
    }

    public void setArrayList(ArrayList<String> arrayList) {
        this.arrayList = arrayList;
    }
}

两个继承它的子类,Air和Best

/**
 * @author wuyimin
 * @create 2021-07-25 21:29
 * @description 在太空中的房子,从屋顶开始建造
 */
public class AirHouseModel extends HouseModel {

    @Override
    public void wall() {
        System.out.println("防辐射墙壁");
    }

    @Override
    public void roof() {
        System.out.println("防辐射屋顶");
    }

    @Override
    public void add() {
        System.out.println("并没有什么装饰");
    }

    @Override
    public void light() {
        System.out.println("太阳光");
    }
}

/**
 * @author wuyimin
 * @create 2021-07-25 21:33
 * @description 建造最好的房屋需要使用其模型
 */
public class BestBuilder extends HouseBuilder {
    //使用了相应的房屋模型
    BestHouseModel bestHouseModel=new BestHouseModel();
    @Override
    public void setArrayList(ArrayList<String> list) {
        bestHouseModel.setArrayList(list);
    }

    @Override
    public BestHouseModel getModel() {
        return bestHouseModel;
    }
}

建造者的抽象类 houseBuilder

/**
 * @author wuyimin
 * @create 2021-07-25 21:31
 * @description
 */
public abstract class HouseBuilder {
    public abstract void setArrayList(ArrayList<String> list);
    public abstract HouseModel getModel();
}

两个实现它的子类best 和air

/**
 * @author wuyimin
 * @create 2021-07-25 21:38
 * @description 建造太空房需要其模型
 */
public class AirBuilder extends HouseBuilder {
    AirHouseModel airHouseModel=new AirHouseModel();

    @Override
    public void setArrayList(ArrayList<String> list) {
        airHouseModel.setArrayList(list);
    }

    @Override
    public AirHouseModel getModel() {
        return airHouseModel;
    }
}

/**
 * @author wuyimin
 * @create 2021-07-25 21:33
 * @description 建造最好的房屋需要使用其模型
 */
public class BestBuilder extends HouseBuilder {
    //使用了相应的房屋模型
    BestHouseModel bestHouseModel=new BestHouseModel();
    @Override
    public void setArrayList(ArrayList<String> list) {
        bestHouseModel.setArrayList(list);
    }

    @Override
    public BestHouseModel getModel() {
        return bestHouseModel;
    }
}

导航类

/**
 * @author wuyimin
 * @create 2021-07-25 21:41
 * @description 向导类,引导应该怎么具体的建造特定的房子
 */
public class Director {
    ArrayList<String> list = new ArrayList<>();
    BestBuilder bestBuilder = new BestBuilder();
    AirBuilder airBuilder = new AirBuilder();
    public AirHouseModel getAirHouseModel(){
        list.clear();
        list.add("roof");
        list.add("light");
        list.add("wall");
        list.add("add");
        airBuilder.setArrayList(list);
        return airBuilder.getModel();
    }

    public BestHouseModel getBestHouseModel(){
        list.clear();
        list.add("wall");
        list.add("add");
        list.add("roof");
        list.add("light");
        bestBuilder.setArrayList(list);
        return  bestBuilder.getModel();
    }
}

 

posted @ 2021-07-25 21:57  一拳超人的逆袭  阅读(50)  评论(0编辑  收藏  举报