深入理解23种设计模式(4) -- 建造者模式

@[toc]

介绍

  1. 建造者模式(Builder Pattern)又叫生成器模式,是一种对象构建模式,它可以将复制的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同的属性
  2. 建造者模式是一步步创建一个复制的对象,它允许用户只通过指定复制对象的类型和内容就可以构建它们,用户不需要指定细节

在这里插入图片描述

  • Product(产品角色): 一个具体的产品对象
  • Builder (抽象建造者):创建一个Product对象的各个不见指定的接口/抽象类
  • ConcreteBuilder (具体建造这):实现接口,构造和装配各个部件
  • Diretor(指挥者):构建一个使用builder接口的对象,它主要是用于创建一个复杂的对象,它主要又2个作用,一是:隔离了客户与对象的生辰过程,二是:负责控制产品对象的生产过程。

案例

盖房子需求:

  1. 需要建房子,这一过程为打桩、砌墙、封顶
  2. 房子各种各样的,比如普通房,高楼,别墅,各种房子过程虽然一样,但是要求不要相同

新建抽象类 AbstractHouse

public abstract class AbstractHouse {

    //打地基
    public abstract void buildBasic();

    //砌墙
    public abstract void buildWalls();

    //封顶
    public abstract void roofed();

    public void build() {
        buildBasic();
        buildWalls();
        roofed();
    }
}

构建普通房子

public class CommonHouse extends AbstractHouse{
    @Override
    public void buildBasic() {
        System.out.println("打地基。。。。");
    }

    @Override
    public void buildWalls() {
        System.out.println("砌墙。。。。");
    }

    @Override
    public void roofed() {
        System.out.println("封顶。。。。");
    }
}

测试Clinet

public class Client {
    public static void main(String[] args) {
        CommonHouse commonHouse = new CommonHouse();
        commonHouse.build();
    }
}

在这里插入图片描述

传统方式解决

  1. 优点好理解,简单
  2. 设计的程序结构,过于简单,没有设计缓存层对象,程序的扩展和维护不好,也就是说,这种设计方案,耦合度增强了

使用建造者模式

新建House 产品

@Data
public class House {
    private String baise;
    private String wall;
    private String roofed;

}

抽象类 HouseBuilder

public abstract class HouseBuilder {

    protected House house = new House();

    //打地基
    public abstract void buildBasic();

    //砌墙
    public abstract void buildWalls();

    //封顶
    public abstract void roofed();

    //建造房子
    public House buildHouse() {
        return house;
    }
}

普通房子

public class CommonHouse extends HouseBuilder {
    @Override
    public void buildBasic() {
        System.out.println("打地基5m。。。。");
    }

    @Override
    public void buildWalls() {
        System.out.println("砌墙5m。。。。");
    }

    @Override
    public void roofed() {
        System.out.println("封顶5m。。。。");
    }
}

高楼

public class HignBuilding extends HouseBuilder{
    @Override
    public void buildBasic() {
        System.out.println("高楼地基100m");
    }

    @Override
    public void buildWalls() {
        System.out.println("高楼砌墙100m");
    }

    @Override
    public void roofed() {
        System.out.println("高楼封顶100m");
    }
}

指挥者

public class HouseDirector {
    HouseBuilder houseBuilder = null;

    //构造器传入
    public HouseDirector(HouseBuilder houseBuilder){
        this.houseBuilder = houseBuilder;
    }

    //setter传入
    public void setHouseBuilder(HouseBuilder houseBuilder){
        this.houseBuilder = houseBuilder;
    }


    //如何处理建造房子流程,交给指挥者
    public House constructHouse(){
        houseBuilder.buildBasic();
        houseBuilder.buildWalls();
        houseBuilder.roofed();
        return houseBuilder.buildHouse();
    }
}

测试

public class Client {
    public static void main(String[] args) {
        //普通房子
        CommonHouse commonHouse = new CommonHouse();
        HouseDirector houseDirector = new HouseDirector(commonHouse);
        House house = houseDirector.constructHouse();

        HignBuilding hignBuilding = new HignBuilding();
        HouseDirector houseDirector2 = new HouseDirector(hignBuilding);
        houseDirector2.constructHouse();
        }
}

在这里插入图片描述

优点和缺点

优点:

1)封装性。是客户端不必知道产品内部组成的细节。
2)便于控制细节风险。可以对建造过程逐步细化,而不对其他模块产生任何影响。

缺点:

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

适用场景:

 1) 多个部件或零件,都可以装配到一个对象中,但产生的结果又不相同时。
 2)需要生成的对象具有复杂的内部结构时。

在我们JDK 中 java.lang.StringBuilder中就使用了 建造者模式



github Demo地址 : ~~~传送门~~~

个人博客地址:http://blog.yanxiaolong.cn/

end
  • 作者:yxl(联系作者)
  • 发表时间:2021-03-01 14:00
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 公众号转载:请在文末添加作者公众号二维码(公众号二维码见右边,欢迎关注)
  • 评论