之前在用框架的时候发现建立一个对象要连着.出不少方法,最后竟然返回了我要的对象,不明觉厉,竟然是建造者模式。其实建造者没那么神奇,相似于建房子,将房子这个对象和建造的过程分离,而后咱们在建造的过程当中执行一步步的步骤,最后一步把建好的房子返回给我。建造者模式的定义:将一个复杂对象的构造与它的表示分离,使一样的构建过程能够建立不一样的表示,这样的设计模式被称为建造者模式。设计模式
工厂类模式提供的是建立单个类的模式,而建造者模式则是将各类产品集中起来进行管理,用来建立复合对象,所谓复合对象就是指某个类具备不一样的属性。
使用场景:
一、须要生成的对象具备复杂的内部结构。
二、须要生成的对象内部属性自己相互依赖。
与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。bash
一、Builder:为建立一个产品对象的各个部件指定抽象接口
二、ConcreteBuilder:实现Builder的接口,构造和装配该产品的各个组件,并提供建立该产品的一个接口
三、Director:构造一个使用Builder接口的对象。
四、Product:表示被构造的复杂对象框架
从上图能够看出Builder是为建立一个Product对象的各个部件指定的抽象接口,Product是具体的产品,Director是一个建造者,由他指挥使用Builder,ConcreteBuilder是具体的建造,实现Builder接口的各个方法。ide
下面以建房子为例使用静态内部类的方式建一个房子测试
public class House {
/**
* 房子的地基
*/
private String basic;
/**
* 房子的墙
*/
private String wall;
/**
* 房子的屋顶
*/
private String roof;
public House(HouseBuilder houseBuilder) {
this.basic = houseBuilder.basic;
this.wall = houseBuilder.wall;
this.roof = houseBuilder.roof;
}
@Override
public String toString() {
return "House{" +
"basic='" + basic + '\'' + ", wall='" + wall + '\'' + ", roof='" + roof + '\'' +
'}';
}
public static class HouseBuilder {
private String basic;
private String wall;
private String roof;
/**
* 打地基
* @param basic
* @return
*/
public HouseBuilder buildBasic(String basic) {
this.basic = basic;
return this;
}
/**
* 砌墙
* @param wall
* @return
*/
public HouseBuilder buildWall(String wall) {
this.wall = wall;
return this;
}
/**
* 建楼顶
* @param roof
* @return
*/
public HouseBuilder buildRoof(String roof) {
this.roof = roof;
return this;
}
/**
* 建造房子
* @return
*/
public House build() {
return new House(this);
}
}
}
复制代码
本例中房子有地基,墙,屋顶三个属性,而建房子就是组装这三个部件,组成一个房子,也就是三个步骤:打地基,砌墙和建屋顶,而后在HouseBuilder中要提供一个对外的接口,将建好的House交出去,就是build()方法。ui
public static void main(String [] args) {
House house = new House.HouseBuilder()
.buildBasic("地基要稳固")
.buildWall("墙要刷的很白")
.buildRoof("楼顶要结实")
.build();
System.out.println(house.toString());
}
复制代码
运行结果: this