定义:
建造者模式或者生成器模式(Builder),是由GoF提出的23种设计模式中的一种。
Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
结构:
应用场景
-
对象的创建:Builder模式是为对象的创建而设计的模式。
-
创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象。
-
关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法。
举例
-
有这么一个普通的House类,一般情况下我们会让客户直接new出一个对象,然后再通过set属性的方法进行造房子,但这样会把所有实现的细节全都暴露给客户,由客户对房子进行修饰,这样会有一个问题,有时候我们并不想让实现细节暴露出来,因此,就要引入了建造者模式。
/*房子对象*/ 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; } } //客户直接造房子 House house = new House(); house.setFloor("地板"); house.setWall("墙"); house.setHousetop("屋顶");
-
使用建造者模式对对象进行装饰:
-
Concrete对象:抽象的工程队,可以完成一系列的操作。
/* 工程队*/ public interface HouseBuilder { // 修地板 public void makeFloor(); // 修墙 public void makeWall(); // 修屋顶 public void makeHousetop(); // 获取对象 public House getHouse(); }
-
Builder:
/*公寓工程队*/ public class GongyuBuilder implements HouseBuilder{ House house = new House(); public House getHouse() { return house; } public void makeFloor() { house.setFloor("公寓-->地板"); } public void makeHousetop() { house.setHousetop("公寓-->房顶"); } public void makeWall() { house.setWall("公寓-->墙"); } } /*平房工程队*/ public class PingFangBuilder implements HouseBuilder { House house = new House(); public void makeFloor() { house.setFloor("平房-->地板"); } public void makeHousetop() { house.setHousetop("平房-->房顶"); } public void makeWall() { house.setWall("平房-->墙"); } public House getHouse() { return house; } }
-
Director:设计者,对屋子进行构建。
public class HouseDirector { public void makeHouse(HouseBuilder builder) { builder.makeFloor(); builder.makeWall(); builder.makeHousetop(); } }
-
MainClass:
public class MainClass { public static void main(String[] args) { // 设计者来设计屋子 HouseDirector director = new HouseDirector(); // 由工程队来修 HouseBuilder builder = new PingFangBuilder(); // HouseBuilder builder = new GongyuBuilder(); director.makeHouse(builder); House house = builder.getHouse(); System.out.println(house.getFloor()); System.out.println(house.getWall()); System.out.println(house.getHousetop()); } }
-
在Main方法中可以看到,在构建对象的时候,客户不需要对数据进行细节操作,只需要创建出工程队和设计者,设计者会将所有操作交给工程队来做,我们只需要一个想要实现的工程队即可,它会给我们创建出相应的对象。