了解23种设计模式之建造者模式

一,什么是建造者模式

Builder 模式又叫 建造者模式或者生成器模式。是由GoF 提出的23种设计模式中的一种。

Builder 模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,

通过子类继承和重载的方式,动态的创建具有复合属性的对象。

 

二,装饰模式的结构

 

抽象建造者(builder):描述具体建造者的公共接口,一般用来定义建造细节的方法,并不涉及具体的对象部件的创建。

具体建造者(ConcreteBuilder):描述具体建造者,并实现抽象建造者公共接口。

指挥者(Director):调用具体建造者来创建复杂对象(产品)的各个部分,并按照一定顺序(流程)来建造复杂对象。

产品(Product):描述一个由一系列部件组成较为复杂的对象。

 

三,应用场景,优点,缺点。

应用场景:对象的创建:Builder 模式是为对象的创建而设计的模式

创建的是一个复合对象:被创建的对象为了一个具有复合属性的复合对象

关注对象创建的各部分的创建过程:不同的工厂(这里指build生成器)对产品属性有不同的创建方法

优点:

1,产品的建造和表示分离,实现了解耦。

2,将复杂产品的创建步骤分解在不通过的方法中,使得创建过程更加清晰。

3,增加新的具体建造者无需修改原有了类库的代码,易于拓展,符合“开闭原则“。

缺点:

1、产品必须有共同点,限制了使用范围。

2、如内部变化复杂,会有很多的建造类,难以维护

四:代码实现:

1,产品:Product.java

public class House {
    //地板
    private String floor;
    //墙
    private String wall;
    //屋顶
    private String housetop;

    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 getHousetop() {
        return housetop;
    }

    public void setHousetop(String housetop) {
        this.housetop = housetop;
    }
}

2,建造者:Builder.java

public interface HouseBuilder {

    //修地板
    public void makeFloor();

    //修墙
    public void makeWall();

    //修屋顶
    public  void makeHouseTop();

    //返回对象
    public  House createHouse();
    
}

3,具体建造者:ConcreteBuilder.java 

  两个 不同的建造者

3.1

public class PingFangBuilder implements HouseBuilder {
    House house = new House();

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

    @Override
    public void makeWall() {
        house.setWall("墙");
    }

    @Override
    public void makeHouseTop() {
        house.setHousetop("房顶");
    }

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

3.2

public class GongyuBuilder implements HouseBuilder{
    House house = new House();
    @Override
    public void makeFloor() {
        house.setFloor("别墅 ---》地板");
    }

    @Override
    public void makeWall() {
        house.setWall("别墅 ---》墙");
    }

    @Override
    public void makeHouseTop() {
        house.setHousetop("别墅 ---》屋顶");
    }

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

4.指挥者:Director.java

public class HouseDirector {

    private HouseBuilder houseBuilder;

    public HouseDirector(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    public House makeHouse(){
        houseBuilder.makeWall();
        houseBuilder.makeHouseTop();
        houseBuilder.makeFloor();
        House house  = houseBuilder.createHouse();
        return  house;
    }

    public HouseBuilder creBuilder(String type){
        try {
            Class houseBuilder  = Class.forName(type);
            return (HouseBuilder)houseBuilder.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("找不到对象");
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            System.out.println("实例化错误");
        } catch (InstantiationException e) {
            e.printStackTrace();
            System.out.println("非法访问异常");
        }
        return  null;
    }

}

测试:

public class Test {
    public static void main(String[] args) {

     /*   House house = new House();
        house.setFloor("地板");
        house.setWall("墙");
        house.setHousetop("屋顶");*/

        HouseBuilder houseBuilder = new PingFangBuilder();
        /*houseBuilder.makeHouseTop();
        houseBuilder.makeWall();
        houseBuilder.makeFloor();
        House house  = houseBuilder.createHouse();

        System.out.println(house.getWall());
        System.out.println(house.getHousetop());
        System.out.println(house.getFloor());*/

        HouseDirector houseDirector = new HouseDirector(houseBuilder);
        House house  =  houseDirector.makeHouse();

        System.out.println(house.getWall());
        System.out.println(house.getHousetop());
        System.out.println(house.getFloor());
    }

}

五:总结

将复杂产品的具体属性 交给不同的 建造者去设计,指挥者 来具体的调用不同的建造者。 而我们只需要跟指挥者说 我要建造什么样的产品,指挥者就给我什么产品。 对产品的分离,实现解耦。使代码更加符合开闭原则,关闭修改,开放拓展。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章