1.建造者模式的定义和特点
建造者模式(Builder)的定义: Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
该模式的主要优点如下:
- 各个具体的建造者相互独立,有利于系统的扩展。
- 客户端不必知道产品内部组成的细节,便于控制细节风险。
其缺点如下:
- 产品的组成部分必须相同,这限制了其使用范围。
- 如果产品的内部变化复杂,该模式会增加很多的建造者类。
建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。
2.建造者模式的结构与实现
1.模式的结构
建造者(Builder)模式的主要角色:
- 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个部件
- 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()
- 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法
- 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息
2.结构图
3.实现
使用建造者模式描述客房装修?
分析:客房装修是一个复杂的过程,它包含墙体的装修、电视机和床的布局等,酒店老板把装修的需求告诉专门的装修公司,装修公司找具体的装修工人一步步完成客房的装修。
这里客房是产品,包含墙、电视机、床等组成。具体的装修工人是具体的建造者,负责装修墙以及电视和床的布局,装修公司是指挥者,负责指挥装修工人进行装修。
测试代码:
public class BuilderTest {
public static void main(String[] args) {
IRoomBuilder builder = new NomalRoomBuilder();
RoomDirector director = new RoomDirector(builder);
GuestRoom guestRoom = director.build();
guestRoom.show();
IRoomBuilder starBuilder = new StarRoomBuilder();
RoomDirector director1 = new RoomDirector(starBuilder);
GuestRoom guestRoom1 = director1.build();
guestRoom1.show();
}
}
运行结果:
毛坯装修墙 黑白电视 木板床
精装修的墙 智能电视机 欧式风格的床
产品
/**
* 客房
*/
public class GuestRoom {
//墙
private String wall;
//电视
private String tv;
//床
private String bed;
public String getWall() {
return wall;
}
public void setWall(String wall) {
this.wall = wall;
}
public String getTv() {
return tv;
}
public void setTv(String tv) {
this.tv = tv;
}
public String getBed() {
return bed;
}
public void setBed(String bed) {
this.bed = bed;
}
/**
* 展示酒店信息
*/
public void show() {
System.out.println(wall + " " + tv + " " + bed);
}
}
建造者:
/**
* 抽象建造者:客房装修工人
*/
public interface IRoomBuilder {
GuestRoom getGuestRoom();
void buildWall();
void buildTv();
void buildBed();
}
/**
* 具体建造者:普通客房装修工人
*/
public class NomalRoomBuilder implements IRoomBuilder {
private GuestRoom guestRoom = new GuestRoom();
@Override
public GuestRoom getGuestRoom() {
return guestRoom;
}
@Override
public void buildWall() {
this.guestRoom.setWall("毛坯装修墙");
}
@Override
public void buildTv() {
this.guestRoom.setTv("黑白电视");
}
@Override
public void buildBed() {
this.guestRoom.setBed("木板床");
}
}
/**
* 具体建造者:星级豪华客房装修工人
*/
public class StarRoomBuilder implements IRoomBuilder {
private GuestRoom guestRoom = new GuestRoom();
@Override
public GuestRoom getGuestRoom() {
return guestRoom;
}
@Override
public void buildWall() {
this.guestRoom.setWall("精装修的墙");
}
@Override
public void buildTv() {
this.guestRoom.setTv("智能电视机");
}
@Override
public void buildBed() {
this.guestRoom.setBed("欧式风格的床");
}
}
指挥者:
/**
* 指挥者:装修公司
*/
public class RoomDirector {
private IRoomBuilder builder;
public RoomDirector(IRoomBuilder builder) {
this.builder = builder;
}
/**
* 产品构建与组装方法:装修房子
*/
public GuestRoom build() {
builder.buildWall();
builder.buildTv();
builder.buildBed();
return builder.getGuestRoom();
}
}