-- 创建者模式即隐藏复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。
一、模式结构
组成(角色) | 关系 | 作用 |
---|---|---|
抽象创建者(Builder) | 具体创建者的父类 | 提供产品创建的方法接口 |
具体创建者(Concrete Builder) | 创建者实例,不同的角色 | 不同的角色实现不同的逻辑,最后得提供返回产品实例的方法 |
产品(Product) | 由具体创建者角色创建并返回 | 提供产品的各功能方法,其复杂性被隐藏 |
指导者(Director) | 产品与具体创建者中间件 | 调用具体创建者角色的方法,并给予产品功能属性 |
二、结构栗子
1、抽象创建者 - 房子建造者
2、具体创建者 - 只会造别墅的/只会造公寓的
3、产品 - 房子
4、指导者 - 指挥者
三、建造者模式优缺点
1、优点
- 隐藏了复杂对象的创建过程,客户端无需知道内部细节。
- 扩展性高,创建者之间相互独立
2、缺点
- 暂时未发现 (请大神告知)
四、栗子
1、抽象创建者 - 房子建造者
package com.builder;
public interface HouseBuilder {
void doorMaterial();
void floorMaterial();
House getHouse();
}
2、具体创建者 - 别墅建造者
package com.builder;
/**
* @description: 别墅创建者
* @author: ziHeng
* @create: 2018-08-05 17:07
**/
public class VillaBuilder implements HouseBuilder{
private House house = new House();
//选择门的材料
@Override
public void doorMaterial() {
house.setDoor("大门选择了金刚石");
}
//选择屋顶的材料
@Override
public void floorMaterial() {
house.setFloor("屋顶选择艾德曼金属");
}
//返回产品实例的方法
@Override
public House getHouse() {
return house;
}
}
3、产品 - 房子
package com.builder;
/**
* @description: 房子
* @author: ziHeng
* @create: 2018-08-05 17:04
**/
public class House {
private String floor;
private String door;
private String result;
public String getFloor() {
return floor;
}
public void setFloor(String floor) {
this.floor = floor;
}
public String getDoor() {
return door;
}
public void setDoor(String door) {
this.door = door;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
}
4、指导者
package com.builder;
/**
* @description: 指挥者
* @author: ziHeng
* @create: 2018-08-05 17:15
**/
public class HouseDirector {
public static void makeHouse(HouseBuilder houseBuilder){
System.out.println("选择材料");
houseBuilder.doorMaterial();
houseBuilder.floorMaterial();
System.out.println("材料选择完毕……");
if(houseBuilder.getClass().getSimpleName().equalsIgnoreCase("VillaBuilder")){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
houseBuilder.getHouse().setResult("资金不足,建房项目取消");
System.out.println("资金不足,无法创建别墅");
}else {
houseBuilder.getHouse().setResult("建房成功");
}
}
}
调用Test类:
package com.builder;
/**
* @description: 建造者模式
* @author: ziHeng
* @create: 2018-08-05 16:50
**/
public class BuilderTest {
public static void main(String[] args) {
HouseBuilder houseBuilder = new VillaBuilder();
HouseDirector.makeHouse(houseBuilder);
System.out.println("-------");
System.out.println("获取产品-房屋实例");
House house = houseBuilder.getHouse();
System.out.println(house.getDoor());
System.out.println(house.getFloor());
System.out.println(house.getResult());
}
}