建造者模式(Builder)
Builder模式是一种对象创建型模式,又叫生成器模式,用来隐藏符合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态的创建具有符合属性的对象。
1. 模式中包含的角色及其职责
1.1 产品(Product)
最后客户端需要获得的产品
Product
package com.liuyao;
import lombok.Data;
import lombok.ToString;
/**
* @author liuyao
* @date 2018/07/30
*/
@Data
@ToString
public class House {
private String floor;
private String wall;
private String window;
}
1.2 抽象建造者(Builder)
抽象建造者负责提供建造产品的接口
HouseBuilder
package com.liuyao;
/**
* @author liuyao
* @date 2018/07/30
*/
public interface HouseBuilder {
public void makeFloor();
public void makeWall();
public void makeWindow();
public House getHouse();
}
1.3 具体建造者(Concrete Builder)
实现抽象建造者的建造接口,根据要建造不同的产品完成不同建造
PingFangBuilder
package com.liuyao;
/**
* @author liuyao
* @date 2018/07/30
*/
public class PingFangBuilder implements HouseBuilder {
private House house=new House();
@Override
public void makeFloor() {
house.setFloor("PingFang ==> Floor");
}
@Override
public void makeWall() {
house.setWall("PingFang ==> Wall");
}
@Override
public void makeWindow() {
house.setWindow("PingFang ==> Window");
}
@Override
public House getHouse() {
return house;
}
}
GongYuBuilder
package com.liuyao;
/**
* @author liuyao
* @date 2018/07/30
*/
public class GongYuBuilder implements HouseBuilder {
private House house=new House();
@Override
public void makeFloor() {
house.setFloor("GongYu ==> Floor");
}
@Override
public void makeWall() {
house.setWall("GongYu ==> Wall");
}
@Override
public void makeWindow() {
house.setWindow("GongYu ==> Window");
}
@Override
public House getHouse() {
return house;
}
}
1.4 设计者(Director)
调用对不同具体建造的建造方法来建造产品
HouseDirector
package com.liuyao;
/**
* @author liuyao
* @date 2018/07/30
*/
public class HouseDirector {
public void makeHouse(HouseBuilder houseBuilder){
houseBuilder.makeFloor();
houseBuilder.makeWall();
houseBuilder.makeWindow();
}
}
Main
package com.liuyao;
public class Main {
public static void main(String[] args) {
// 创建工程队 建造平房
HouseBuilder pingFangBuilder=new PingFangBuilder();
// 创建设计者
HouseDirector director=new HouseDirector();
director.makeHouse(pingFangBuilder);
House pingFang=pingFangBuilder.getHouse();
System.out.println(pingFang);
// 建造公寓
HouseBuilder gongYuBuilder = new GongYuBuilder();
director.makeHouse(gongYuBuilder);
House gongYu=gongYuBuilder.getHouse();
System.out.println(gongYu);
}
}
2. 应用场景
- 创建一个符合对象,被创建的对象为一个具有复合属性的符合对象(我上面这是用了String代替,实际上可以创建由更多的复合属性)
- 关注对象创建的各个部分的创建过程,不同的Builder生成器对产品属性有不同的创建方法。