建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式
建造者模式中的角色
抽象建造者:给出一个抽象接口,定义了需要进行的工作,就像指导手册一样
具体建造者:具体的建造者完成抽象方法,返回对象
设计者(指导者):所有提出的需求在设计者这个类里面都能找得到
产品:制造出来的产品
使用场景
- 需要生成的对象具有复杂的内部结构
- 需要生成的对象内部属性本身相互依赖
与工厂模式的区别:建造者模式更加关注与零件装配的顺序
实例说明
以建造一个房子为例
抽象建造者
public interface Build {
public void makeWindow();
public void makeFloor();
public Room getRoom();
}
具体建造者
public class WorkBuilder implements Build{
private Room room=new Room();
@Override
public void makeWindow() {
room.setFloor("地板");
}
@Override
public void makeFloor() {
room.setWindow("窗户");
}
@Override
public Room getRoom() {
return room;
}
}
设计者
public class Designer {
public void order(Build build) {
build.makeFloor();
build.makeWindow();
}
}
产品
public class Room {
private String window;
private String floor;
public String getWindow() {
return window;
}
public void setWindow(String window) {
this.window = window;
}
public String getFloor() {
return floor;
}
public void setFloor(String floor) {
this.floor = floor;
}
@Override
public String toString() {
return "floor: " + floor + ", window: " + window;
}
}
测试类
public class Client {
public static void main(String[] args) {
Build worker = new WorkBuilder(); //获取工人对象
Designer designer = new Designer(); //获取设计师对象
designer.order(worker); //设计师指挥工人工作
System.out.println(worker.getRoom()); //工人交房
}
}
建造者模式的常用方式
在建造者模式中,在实际运用的时候往往会省略掉设计者这个角色
其主要是考虑到不向外暴露太多实现细节
使用链式构建,使得对外隐藏所有细节,这也是build采用的设计思想
public class Room {
private String window;
private String floor;
public void apply(WorkBuilder.RoomParmas parmas)
{
window=parmas.window;
floor=parmas.floor;
}
@Override
public String toString() {
return "floor: " + floor + ", window: " + window;
}
}
public class WorkBuilder{
private RoomParmas parmas;
public WorkBuilder( ) {
this.parmas = new RoomParmas();
}
public WorkBuilder makeWindow(String window ) {
parmas.window = window;
return this;
}
public WorkBuilder makeFloor(String floorCorlor) {
parmas.floor = floorCorlor;
return this;
}
public Room build() {
Room room = new Room();
room.apply(parmas);
return room;
}
class RoomParmas {
public String window;
public String floor;
}
}
public class Client {
public static void main(String[] args) {
Room room = (new WorkBuilder()).makeWindow("玻璃")
.makeFloor("地板").build();
System.out.println(room);
}
}