模式介绍
建造者模式(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平法米。
房子盖好了!