简单的建造者模式,一句话概括“复杂的调用让内部实现,调用者动态调用简单,子类继承方式,动态修改建造内容”

学习建造者模式

        1 ,什么是建造者对象

                         1、隐藏了对象的创建过程,将对象的创建封装,让调用者更简单的创建,通过子类继承或者重载的方式,动态的创建对象。比如盖平房,需要盖楼顶,刷墙,铺地板,此时如果是调用者来实现,调用者需要自己来盖楼顶,刷墙,铺地板,增加了盖房子的难度,我们可以封装一个平房建造者实现建造者对象来处理这些难的事情,如果此时想盖楼房,再创建楼房建造者 实现 建造者对象即可,具体可看以下代码。

                         2、创建房子对象

public class House {
    //地板
    private String floor;
    //墙壁
    private String wall;
    //楼顶
    private String top;

    public String getFloor() {
        return floor;
    }

    public void setFloor(String floor) {
        this.floor = floor;
    }

    public String getWall() {
        return wall;
    }

    public void setWall(String wall) {
        this.wall = wall;
    }

    public String getTop() {
        return top;
    }

    public void setTop(String top) {
        this.top = top;
    }
}

                    3、普通方法盖房子的坏处,调用者自己盖房子,如果字段多了的情况选,稍有不慎,就少初始化一个字段

   public static void main(String[] args) {

        //调用者自己盖房子的方式,如果字段多了的情况选,稍有不慎,就少加一个
        House house = new House();
        house.setTop("盖楼顶");
        house.setWall("刷墙壁");
        house.setFloor("铺地板");
        System.out.println(house.getTop());
        System.out.println(house.getWall());
        System.out.println(house.getFloor());
    }

                     4、通过建造者方式来盖房子,首先创建建造者接口,接口中主要定义了盖房子的操作,建造完后,就可以获取到楼房的对象

public interface HouseBuilder {

    //建造楼顶
    void makeTop();

    //建造墙壁
    void makeWall();

    //建造地板
    void makeFloor();

    //建造好后,获取楼房对象
    House getHouse();
}

               5、实现建造者类,比如想盖平房,这时使用平房来实现建造者接口,用该类来做实际的操作,当然有楼房或者更多,也可以实现接口

public class PingFangHouseBuilder implements HouseBuilder{

    House house = new House();
    @Override
    public void makeTop() {
        house.setTop("平房-楼顶");
    }

    @Override
    public void makeWall() {
        house.setWall("平房-墙壁");
    }

    @Override
    public void makeFloor() {
        house.setFloor("平房-地板");
    }

    @Override
    public House getHouse() {
        return house;
    }
}

            6、有了房子的建造者,那我们就用建造者来盖房子,发现这时创建房子只需要调用建造者方法来创建了,但是此时还有问题,调用者调用方法还是很多,比如房子应该先改地基,但是调用者却先盖了楼顶,这样肯定会出问题,

           那么房子被调用者来控制顺序肯定是不合适的,那么引入一个新的设计模式,那就是设计者模式,调用这些方法的类

  public static void main(String[] args) {

        //这里的PingFangHouseBuilder是指平房,如果有更多,再去创建类来实现HouseBuilder接口
        HouseBuilder houseBuilder = new PingFangHouseBuilder();
        houseBuilder.makeTop();
        houseBuilder.makeWall();
        houseBuilder.makeFloor();

        House house = houseBuilder.getHouse();
        System.out.println(house.getTop());
        System.out.println(house.getWall());
        System.out.println(house.getFloor());
    }

            7、创建设计者类

//房屋设计师
public class HouseDirector {

    private HouseBuilder houseBuilder;

    //构造方法加入建造者,当然也可以其他方式加入
    public HouseDirector(HouseBuilder houseBuilder){
        this.houseBuilder = houseBuilder;
    }


    public House make(){
        houseBuilder.makeTop();
        houseBuilder.makeWall();
        houseBuilder.makeFloor();

        House house = houseBuilder.getHouse();
        return house;
    }
}

           8、直接调用设计师来执行,不再去调用者自己调用方法了

   public static void main(String[] args) {

        //这里的PingFangHouseBuilder是指平房,如果有更多,再去创建类来实现HouseBuilder接口
        HouseBuilder pingFangHouseBuilder = new PingFangHouseBuilder();

        HouseDirector houseDirector = new HouseDirector(pingFangHouseBuilder);
        House house = houseDirector.make();
        System.out.println(house.getTop());
        System.out.println(house.getWall());
        System.out.println(house.getFloor());
    }

猜你喜欢

转载自blog.csdn.net/qq_38384460/article/details/111405497