建造者模式
建造者模式有四个角色
- 产品:如果把产品比作为房子,那么它就是一个具体的产品对象,比如别墅、公寓
- 抽象建造者:盖房子的步骤、方法等。比如都需要打地基、砌墙、封顶
- 具体建造者:实现或者继承抽象建造者
- 指挥者:承建商。它负责盖别墅、公寓。分离不同建造者与不同产品的关系。由指挥者最终交付产品
从第四这个步骤看,实际与工厂方法、抽象工厂是比较像的
举例
工厂方法与建造者模式的区别
工厂方法:注重于整体建造房子。它实际相当于是房产中介。他们不生产房子,你找他要房子,他就给你
建造者模式:犹如你自己亲临参与盖房子的过程,你将会知道盖房子的每一步
抽象工厂与建造者模式的区别
抽象工厂: 抽象工厂是将不同房子归类,由中介里不同的团队负责。你不需要知道哪个团队负责什么房子,你找到中介要房子,中介自己调度团队,最终给你房子
建造者模式: 你需要自己先知道要什么房子,然后找什么样的工程队伍再盖房子
[产品] 基础的房子需要的东西
public class House {
/**
* 卧室数量
*/
private int bedroomNum;
/**
* 客厅数量
*/
private int livingRoomNum;
/**
* 餐厅数量
*/
private int diningRoomNum;
/**
* 其他房间数量
*/
private int otherRoomNum;
public int getBedroomNum() {
return bedroomNum;
}
public void setBedroomNum(int bedroomNum) {
this.bedroomNum = bedroomNum;
}
public int getLivingRoomNum() {
return livingRoomNum;
}
public void setLivingRoomNum(int livingRoomNum) {
this.livingRoomNum = livingRoomNum;
}
public int getDiningRoomNum() {
return diningRoomNum;
}
public void setDiningRoomNum(int diningRoomNum) {
this.diningRoomNum = diningRoomNum;
}
public int getOtherRoomNum() {
return otherRoomNum;
}
public void setOtherRoomNum(int otherRoomNum) {
this.otherRoomNum = otherRoomNum;
}
@Override
public String toString() {
return "房子交付{" +
"卧室: " + bedroomNum +
", 客厅: " + livingRoomNum +
", 餐厅: =" + diningRoomNum +
", 其他: " + otherRoomNum +
'}';
}
}
[抽象建造者]建造房子的基本方法
public abstract class Building {
/**
* 打地基
*/
public abstract void foundation();
/**
* 砌墙
*/
public abstract void brickwork();
/**
* 封顶
*/
public abstract void roofed();
/**
* 交付
*/
public abstract House deliver();
}
[实际建造者] 公寓的建造方法
public class ApartmentBuilder extends Building {
@Override
public void foundation() {
System.out.println("公寓正在打地基");
}
@Override
public void brickwork() {
System.out.println("公寓正在砌墙");
}
@Override
public void roofed() {
System.out.println("公寓正在封顶");
}
@Override
public House deliver() {
House house = new House();
house.setBedroomNum(3);
house.setDiningRoomNum(1);
house.setLivingRoomNum(1);
house.setOtherRoomNum(1);
System.out.println("公寓 - " + house.toString());
return house;
}
public void luxuriousDecoration() {
System.out.println("公寓豪华装修");
}
}
[实际建造者] 别墅的建造方法
public class VillaBuilder extends Building {
@Override
public void foundation() {
System.out.println("别墅正在打地基");
}
@Override
public void brickwork() {
System.out.println("别墅正在砌墙");
}
@Override
public void roofed() {
System.out.println("别墅正在封顶");
}
private void luxuriousDecoration() {
System.out.println("别墅豪华装修");
}
@Override
public House deliver() {
this.luxuriousDecoration();
House house = new House();
house.setBedroomNum(6);
house.setDiningRoomNum(2);
house.setLivingRoomNum(2);
house.setOtherRoomNum(10);
System.out.println("别墅 - " + house.toString());
return house;
}
}
[指挥者] 承建商
public class ConstructionTeam {
private Building build = null;
// 实例承建商时需要告诉承建商你要什么房子
public ConstructionTeam(Building building) {
this.build = building;
}
public House building() {
this.build.foundation();
this.build.brickwork();
this.build.roofed();
return this.build.deliver();
}
}
main
public class Main {
public static void main(String[] args) {
// 别墅
House villa = new ConstructionTeam(new VillaBuilder()).building();
// 公寓
House apartment = new ConstructionTeam(new ApartmentBuilder()).building();
}
}
console
别墅正在打地基
别墅正在砌墙
别墅正在封顶
别墅豪华装修
别墅 - 房子交付{卧室: 6, 客厅: 2, 餐厅: =2, 其他: 10}
公寓正在打地基
公寓正在砌墙
公寓正在封顶
公寓 - 房子交付{卧室: 3, 客厅: 1, 餐厅: =1, 其他: 1}Process finished with exit code 0
网友评论