建造者模式

模式介绍

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象构成。由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。建造者模式与工厂模式的区别是:建造者模式更加关注零件装配的顺序。

模式优点

1、将一个复杂对象的构建分离,使得同样的构建过程可以创建不同的表示。
2、建造者独立,易扩展,便于控制细节风险。

模式缺点

1、产品必须有共同点,范围有限制。
2、如内部变化复杂,会有很多的建造类。

使用场景

1、需要生成的对象具有复杂的内部结构。
2、需要生成的对象内部属性本身相互依赖。

系统建模

1、盖房子模型,涉及对象:房子产品、抽象建造者、具体建造者、指挥者。

系统实现

/**
 * 房子产品
 */
public class House {
    private int roofDeep;
    private int roofHigh;
    private int roofAres;

    public int getRoofDeep() {
        return roofDeep;
    }

    public void setRoofDeep(int roofDeep) {
        this.roofDeep = roofDeep;
    }

    public int getRoofHigh() {
        return roofHigh;
    }

    public void setRoofHigh(int roofHigh) {
        this.roofHigh = roofHigh;
    }

    public int getRoofAres() {
        return roofAres;
    }

    public void setRoofAres(int roofAres) {
        this.roofAres = roofAres;
    }
}
/**
 * 房子Builder的抽象类
 */
public abstract class AbstarctHouseBuilder {
    protected House house = new House();
    public abstract AbstarctHouseBuilder buildBasic(int deep);
    public abstract AbstarctHouseBuilder buildWalls(int high);
    public abstract AbstarctHouseBuilder buildRoof(int ares);

    public House getHouse(){
        return house;
    }
}
/**
 *房子Builder的实现类
 */
public class CommenHouseBuider extends AbstarctHouseBuilder {

    @Override
    public AbstarctHouseBuilder buildBasic(int deep) {
        System.out.println("打地基中,地基的深度:"+deep+"米");
        house.setRoofDeep(deep);
        return this;
    }

    @Override
    public AbstarctHouseBuilder buildWalls(int high){
        System.out.println("砌墙中,墙的高度:"+high+"米");
        house.setRoofHigh(high);
        return this;
    }

    @Override
    public AbstarctHouseBuilder buildRoof(int ares){
        System.out.println("建筑中,屋顶的面积:"+ares+"平法米。");
        house.setRoofAres(ares);
        return this;
    }
}
/**
 *建造房子的指挥者
 */
public class HouseDirector {
    AbstarctHouseBuilder abstarctHouseBuilder = null;

    public HouseDirector(AbstarctHouseBuilder abstarctHouseBuilder){
        this.abstarctHouseBuilder = abstarctHouseBuilder;
    }
    public House constructor(){
        abstarctHouseBuilder.buildBasic(5)
                .buildWalls(20)
                .buildRoof(150);
        System.out.println("房子盖好了!");
        return abstarctHouseBuilder.getHouse();
    }
}

/**
 *客户端
 */
public class Client {
    public static void main(String args[]){
        // 创建普通房子Builder
        AbstarctHouseBuilder buider = new CommenHouseBuider();
        HouseDirector houseDirector = new HouseDirector(buider);
        houseDirector.constructor();
    }
}

结果:
打地基中,地基的深度:5米
砌墙中,墙的高度:20米
建筑中,屋顶的面积:150平法米。
房子盖好了!
原文地址:https://www.cnblogs.com/feiqiangsheng/p/12086754.html