建造者模式
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心。
分类
抽象建造者(Abstract Builder)角色:给出一个抽象解耦,以规范产品对象的各个组成成分建造。具体建造者类必须实现这个接口锁要求的两种方法:一种是建造方法,另一种是结果返还方法。有多少零件就应该有多少建造方法。
具体建造者(Concrete Builder)角色:担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序调用下创建产品实例。它要完成的任务包括:
A.实现抽象建造者锁声明的接口,给出一步一步地完成创建产品实例的操作;
B.在建造完成之后,提供产品实例。
导演者(Director)角色:调用具体建造者角色以创建产品对象,它与客户端打交道。
产品(Product)角色:它是建造中的复杂对象。
简单实例
抽象建造者:
public interface Builder {
public void createFloor();
public void createWall();
public void createRoof();
public void createWindow();
}
真实建造者:
中式风格建造
public class ChinaWorker implements Builder {
public House house = new ChinaHouse();
@Override
public void createFloor() {
house.setFloor(" create china Floor ");
}
@Override
public void createRoof() {
house.setRoof(" create china Roof ");
}
@Override
public void createWall() {
house.setWall(" create china Roof ");
}
@Override
public void createWindow() {
house.setWindow(" create china Window ");
}
@Override
public House getHouse() {
return house;
}
}
英式风格建造者
public class EnglishWorker implements Builder {
public House house = new EnglishHouse();
@Override
public void createFloor() {
house.setFloor(" create english Floor ");
}
@Override
public void createRoof() {
house.setRoof(" create english Roof ");
}
@Override
public void createWall() {
house.setWall(" create english Roof ");
}
@Override
public void createWindow() {
house.setWindow(" create english Window ");
}
@Override
public House getHouse() {
return house;
}
}
产品:
public class House {
public String floor;
public String wall;
public String roof;
public String window;
public String getFloor() {
return floor;
}
public void setFloor(String floor) {
this.floor = floor;
}
public String getWall() {
return wall;
}
public void setWall(String wall) {
this.wall = wall;
}
public String getRoof() {
return roof;
}
public void setRoof(String roof) {
this.roof = roof;
}
public String getWindow() {
return window;
}
public void setWindow(String window) {
this.window = window;
}
}
public class ChinaHouse extends House {
}
public class EnglishHouse extends House {
}
导演:
public class Designer {
public void command(Builder builder) {
builder.createFloor();
builder.createRoof();
builder.createWall();
builder.createWindow();
}
}
客户端:
public class Client {
public static void main(String[] args) {
Builder builder = new ChinaWorker();
House house = new Designer().command(builder);
System.out.println(house.window);
builder = new EnglishWorker();
house = new Designer().command(builder);
System.out.println(house.window);
// create china Window
// create english Window
}
}