建造者模式:是将一个复杂的对象的构建与它的内部表示分离,使得同样的构建过程可以创建不同的表示。建造模式是对象的创建模式。
如白宫和酒店的建造,基本构建流程一致,如包括打地基、房间主体、装修三个步骤,那么可以将同样的构建过程抽象出来,根据具体建造对象不同表示来完成建造对象。
建造者模式有如下几个角色:
抽象建造者(Builder)角色:抽象出建造流程的规范。
具体建造者(ConcreteBuilder)角色:具体创建对象或产品的实施者。具体建造者类必须实现这个Builder接口所要求的两种方法:一种是建造方法(buildPart1和 buildPart2),另一种是返还结构方法(retrieveResult)。
导演者(Director)角色:调用具体建造者角色以创建产品对象。
产品(Product)角色:产品便是建造中的复杂对象。一个系统中可能会有多个产品类,而且这些产品类并不一定有共同的接口,而完全可以是不相关联的。
图片来自网络:
实例如下:
//builder角色,负责规范建造流程
public interface HouseBuilder {
public void buildGround();//打地基
public void buildRoom();//建造房屋主体
public void buildDecoration();//装修
House buildHouse();//返回建造对象
}
//白宫具体建造者
public class WhileHouse implements HouseBuilder{
House house;
public WhileHouse(House house) {
this.house = house;
}
@Override
public void buildGround() {
house.setGround("white house ground");
}
@Override
public void buildRoom() {
house.setRoom("white house room");
}
@Override
public void buildDecoration() {
house.setDecoration("white house decorate");
}
@Override
public House buildHouse() {
return house;
}
}
//酒店具体建造者
public class Hotel implements HouseBuilder{
House house;
public Hotel(House house) {
this.house = house;
}
@Override
public void buildGround() {
house.setGround("hotel ground");
}
@Override
public void buildRoom() {
house.setRoom("hotel room");
}
@Override
public void buildDecoration() {
house.setDecoration("hotel decorate");
}
@Override
public House buildHouse() {
return house;
}
}
//具体对象
public class House {
private String ground;
private String room;
private String decoration;
public String getGround() {
return ground;
}
public void setGround(String ground) {
this.ground = ground;
}
public String getRoom() {
return room;
}
public void setRoom(String room) {
this.room = room;
}
public String getDecoration() {
return decoration;
}
public void setDecoration(String decoration) {
this.decoration = decoration;
}
}
//建筑师导演,根据不同具体builder来生成不同表示,返回具体建造对象或产品
public class MechanicDirector {
public House build(HouseBuilder houseBuilder){
houseBuilder.buildGround();
houseBuilder.buildRoom();
houseBuilder.buildDecoration();
return houseBuilder.buildHouse();
}
}
//示例生成不同对象代码
public class Test {
public static void main(String[] args) {
MechanicDirector mechanicDirector=new MechanicDirector();
House whieHouse=mechanicDirector.build(new WhileHouse(new House()));
House hotel=mechanicDirector.build(new Hotel(new House()));
}
}
工厂模式关注的是创建单个产品,而建造者模式则关注创建复杂对象,具有多个不同属性的对象。具体看情况使用。