1.定义:将一个复杂对象的创建和表示分离,是相同的构建过程产生构建出不同的表示。该模式倾向于流程抽象
2.UML
3.理论基础:继承,抽象
4.涉及角色:
抽象构建者:定义了构建某类抽象产品的具体流程。属于流程的抽象。因为产品是按照流程逐步构建的所以需要提供获得产品的访问点。总结作用主要有1.定义产品构建流程。2.提供获得产品访问点
具体构建者:抽象构建者的子类,针对于某个具体产品的构建流程
指挥者:不管是采用属性还是api参数的形式,该类都会持有抽象建造者的实例。采用多态的方式完成产品的构建。在指挥者中规定了产品的构建流程。产品的构建就是在指挥者中完成的
抽象产品:抽象产品,客户端通过访问点获得产品为抽象产品类型
具体产品:抽象产品的子类
5.优点
1.建造代码和表示代码分离
2.建造者隐藏了产品的组装流程。客户端不需要关注产品的组装过程,只需要消费对象
3.方便扩展。遵守开闭原则。如果产品的内部表示发生变化,只需要再定义一个具体的构建者
4.具体建造者相互对立,也就是说可以在具体的建造者中进行流程的细化
5.流程固定,具体细节可以延迟到子类
6.缺点
1. 由于建造社属于流程抽象,需要对流程抽象。抽象流程将是难点。如果流程抽象的不具有一般性或者通用性。后续对流程的修改回比较麻烦
7.使用场景
1.创建复杂对象,对象的内部组成的建造顺序是稳定的,但是具体到某个对象的内部组成面临者复杂的变化
2.创建过程独立于对象的组成也独立于组成部分的装配
8. Code
流程抽象IBuilder
public interface IBuyHouse {
//选择楼盘
public void choiceBuilding();
//在给定的楼盘中选择价格
public void choicePrice();
//砍价
public int bargain();
//交首付
public int payments();
//签合同
public void signContract();
//验收
public boolean checkHouse();
//获得房子
public IHouse getHouse();
}
//具体建造者
public class BuyHDHouse implements IBuyHouse {
//具体产品,在该建造者中实现该产品的组装
private HDHouse hdHouse = new HDHouse();
@Override
public void choiceBuilding() {
//TODO 完成具体产品的部分组装
System.out.println("选择HD楼盘");
}
@Override
public void choicePrice() {
//TODO 完成具体产品的部分组装
System.out.println("预售价格: 9500");
}
@Override
public int bargain() {
//TODO 完成具体产品的部分组装
System.out.println("成交价格: 9000");
return 9000;
}
@Override
public int payments() {
//TODO 完成具体产品的部分组装
System.out.println("首付款: 22W");
return 220000;
}
@Override
public void signContract() {
//TODO 完成具体产品的部分组装
System.out.println("和建行签合同");
}
@Override
public boolean checkHouse() {
//TODO 完成具体产品的部分组装
System.out.println("验收房子:通过");
return true;
}
@Override
public IHouse getHouse() {
//完成组装后获得产品
return hdHouse;
}
}
public class BuyWKHouse implements IBuyHouse {
//具体产品,在该建造者中实现该产品的组装
private WKHouse wkHouse = new WKHouse();
@Override
public void choiceBuilding() {
//TODO 完成具体产品的部分组装
System.out.println("选择WK楼盘");
}
@Override
public void choicePrice() {
//TODO 完成具体产品的部分组装
System.out.println("预售价格: 11000");
}
@Override
public int bargain() {
//TODO 完成具体产品的部分组装
System.out.println("成交价格: 10000");
return 9000;
}
@Override
public int payments() {
//TODO 完成具体产品的部分组装
System.out.println("首付款: 30W");
return 300000;
}
@Override
public void signContract() {
//TODO 完成具体产品的部分组装
System.out.println("和招商签合同");
}
@Override
public boolean checkHouse() {
//TODO 完成具体产品的部分组装
System.out.println("验收房子:不通过");
return true;
}
@Override
public IHouse getHouse() {
//完成组装后获得产品
return wkHouse;
}
}
//指挥者
public class Director {
public void buyHouse(List<IBuyHouse> buyHouses) {
for (IBuyHouse buyHouse : buyHouses) {
buyHouse.choiceBuilding();
buyHouse.choicePrice();
buyHouse.bargain();
buyHouse.payments();
buyHouse.signContract();
buyHouse.checkHouse();
System.out.println("流程结束,获得房子");
System.out.println();
}
}
}
//抽象产品
public abstract class IHouse {
}
//具体产品
public class HDHouse extends IHouse {
//TODO 实现逻辑
}
public class WKHouse extends IHouse {
//TODO 实现逻辑
}
//客户端
public class Client {
public static void main(String[] args) {
List<IBuyHouse> list = new ArrayList<IBuyHouse>();
IBuyHouse hdHouse = new BuyHDHouse();
IBuyHouse wkHouse = new BuyWKHouse();
list.add(hdHouse);
list.add(wkHouse);
Director director = new Director();
director.buyHouse(list);
System.out.println("get house: " + hdHouse.getHouse());
System.out.println("get house: " + wkHouse.getHouse());
}
}