🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 前言 Builder(构造者)模式也是一种常用的设计模式,它是用来一步一步构建复杂事物而设计的模式,使用这种模式可以使得**复杂事物的构建与展示相分离**,具有降低耦合,向外部隐藏复杂事物的构建过程等优点。 Builder模式的使用场景:  (1)相同的方法,不同的执行顺序,产生不同的结果;  (2)多个部件或零件,属性都可以装配到一个对象中,但是产生的运行又不相同;  (3)产品类非常复杂,或者产品类中的调用顺序不同产生不同的作用,这个时候用Builder模式非常合适;  (4)当初始化一个对象特别复杂,如:参数属性多,且很多参数都有默认值。 ### Builder模式的实现 以生产汽车为例展示Builder模式的过程。我们知道汽车有很多零件,什么方向盘,发动机,轮子等等,同时它还有一个属性,如:名称,价格,级别等。这些都要汽车生产商来完成,那么汽车生产商就是Builder。汽车生产好了以后要投入市场出售,这时汽车会在汽车商城展示。 1、汽车 –>要构建的复杂的事物 ~~~ public class Car { private String name; // 名称:宝马,奔驰,奥迪... private String price; // 价格,3万,10万... private String grade; // 级别,小型车,中型车,大型车 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public String getGrade() { return grade; } public void setGrade(String grade) { this.grade = grade; } @Override public String toString() { return "Car [name=" + name + ", price=" + price + ", grade=" + grade + "]"; } } ~~~ 这里只为了展示Builder模式,所以不涉及零件或者属性等具体的实现。 2、汽车生产商–>CarBuilder.java ~~~ public class CarBuilder { private String name; private String price; private String grade; /** * 构造名称 */ public CarBuilder buildName(String name){ this.name = name; return this; } /** * 构造价格 */ public CarBuilder buildPrice(String price){ this.price = price; return this; } /** * 构造级别 */ public CarBuilder buildGrade(String grade){ this.grade = grade; return this; } /** * 生产汽车 */ public Car create(){ Car car= new Car(); car.setName(name); car.setPrice(price); car.setGrade(grade); return car; } } ~~~ 通常来说,Builder的setter会返回自身this,这样可以实现链表式操作,这里的CarBuilder代表汽车生产商,模拟汽车的生产过程。 3、汽车商城(展示汽车)–>CarShow.java ~~~ public class CarShow { private CarBuilder builder; public CarShow(CarBuilder builder){ this.builder = builder; } public Car getCar(){ return builder.create(); } } ~~~ 这一步有时候也往往会省略,即只有Builder,这只实现汽车的一个展示的过程,客户也可以直接去汽车生产商那买汽车,不用去汽车商城买汽车。 4、客户挑选汽车–>Test.java ~~~ public class Test { public static void main(String[] args) { CarBuilder builder = new CarBuilder(); builder.buildName("宝马"); builder.buildPrice("100万"); builder.buildGrade("小型车"); Car car = builder.create(); System.out.println(new CarShow(builder).getCar()); } } ~~~ 结果: ![这里写图片描述](https://box.kancloud.cn/2016-03-17_56ea5b36b8610.jpg "") 即:客户实际看到的汽车是100万的小型车宝马 总结:上面的这些就是Builder的过程,通常就是两步,即:构建和展示。有时候会省略展示的过程,直接由构建者Builder完成构建和展示。上面的例子不是为了初始化一个Car对象而是为了通过这种模式模拟实现汽车的构造和展示相分离。如果我们将Builder设置成一个接口或者抽象类,那么传入不同的Buidler就可以得到不同的汽车,这样一来这种模式的灵活性和可扩展性就大大提高了,而且耦合性非常低。