生成器模式封装一个产品的构造过程,并允许按照步骤构造
java类图
java代码
// 计划类
public class Planner {
private Date date;
private String hotelName;
private String roomName;
private String eventName;
private String ticketName;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getHotelName() {
return hotelName;
}
public void setHotelName(String hotelName) {
this.hotelName = hotelName;
}
public String getRoomName() {
return roomName;
}
public void setRoomName(String roomName) {
this.roomName = roomName;
}
public String getEventName() {
return eventName;
}
public void setEventName(String eventName) {
this.eventName = eventName;
}
public String getTicketName() {
return ticketName;
}
public void setTicketName(String ticketName) {
this.ticketName = ticketName;
}
@Override
public String toString() {
return "Planner{" +
"date=" + date +
", hotelName='" + hotelName + '\'' +
", roomName='" + roomName + '\'' +
", eventName='" + eventName + '\'' +
", ticketName='" + ticketName + '\'' +
'}';
}
}
// 生成器接口
public interface Builder {
void buildDay(Date date);
void addHotel(String hotelName);
void addReservation(String roomName);
void addSpecialEvent(String eventName);
void addTicket(String ticketName);
Planner getPlanner();
}
// 假期生成器
public class VacationBuilder implements Builder {
private Planner planner = new Planner();
@Override
public void buildDay(Date date) {
planner.setDate(date);
}
@Override
public void addHotel(String hotelName) {
planner.setHotelName(hotelName);
}
@Override
public void addReservation(String roomName) {
planner.setRoomName(roomName);
}
@Override
public void addSpecialEvent(String eventName) {
planner.setEventName(eventName);
}
@Override
public void addTicket(String ticketName) {
planner.setTicketName(ticketName);
}
public Planner getPlanner() {
return planner;
}
}
// 客户类
public class Client {
public Planner constructPlanner() {
Builder builder = new VacationBuilder();
builder.buildDay(new Date());
builder.addHotel("room 101");
builder.addReservation("as home");
builder.addSpecialEvent("big bao");
builder.addTicket("one day");
return builder.getPlanner();
}
}
// 测试类
public class Test {
public static void main(String[] args) {
new Test().test();
}
private void test() {
Client client = new Client();
Planner planner = client.constructPlanner();
System.out.println(planner.toString());
}
}
注:
- 生成器模式与工厂模式相比,采用生成器创建对象的客户,需要具备更多的邻域知识。
- 经常被用来创建组合模式.
- j将一个复杂对象的创建过程封装起来。
- 允许对象通过多个步骤来创建,并且可以改变过程(这和只有一个过程的工厂不同)。
- 向客户隐藏产品的内部表现。
- 产品的实现可以被替换,因为客户只看到一个抽象的接口。
参考文章
Head First 设计模式