现在的位置: 首页 > 综合 > 正文

Builder模式

2013年02月12日 ⁄ 综合 ⁄ 共 2431字 ⁄ 字号 评论关闭

Builder模式使用于:需要构造的对象比较复杂或变化较多,而且可以分成若干步骤的。   一个情景如下:

你需要发明一台机器,这个机器可以为每一个旅游的人打印一份计划出来,这个计划是多种多样,每个人的计划又不同。如下图所示:

那这个计划如何生成?  种类这么多,使用的人这么多,这时候可以使用生成者模式代码如下:

//Builder.java

package com.facaizhu;

import java.util.Date;

interface Builder {
	void buildDay();
	void addHotel(String hotelName);
	void addRestaurant(String resName);
	void addSpecialEvent(String eventName);
	void addTickets(String itemName);
	
	Planner getVocationPlanner();
}

class VocationBuilder implements Builder {

	private Planner planner;
	
	public VocationBuilder() {
		planner = new Planner();
	}
	@Override
	public void buildDay() {
		planner.setDate(new Date());
	}

	@Override
	public void addHotel(String hotelName) {
		planner.setHotelName(hotelName);
	}

	@Override
	public void addRestaurant(String resName) {
		planner.setResName(resName);
	}

	@Override
	public void addSpecialEvent(String eventName) {
		planner.setSpecialEventName(eventName);
	}

	@Override
	public void addTickets(String itemName) {
		planner.setItemNameofTicket(itemName);
	}

	@Override
	public Planner getVocationPlanner() {
		return planner;
	}
	
}

//Planner.java

package com.facaizhu;
import java.util.Date;

public class Planner {
	private Date date;
	private String hotelName;
	private String resName;
	private String specialEventName;
	private String itemNameofTicket;
	
	
	public void printPlan() {
		if(null != date)
			System.out.println("Date:" + date);
		if(null != hotelName)
			System.out.println("Hotel: " + hotelName);
		if(null != resName)
			System.out.println("Restaurant: " + resName);
		if(null != specialEventName)
			System.out.println("SpecialEvent: " + specialEventName);
		if(null != itemNameofTicket)
			System.out.println("Ticket: " + itemNameofTicket);
	}


	public void setDate(Date date) {
		this.date = date;
	}


	public void setHotelName(String hotelName) {
		this.hotelName = hotelName;
	}


	public void setResName(String resName) {
		this.resName = resName;
	}


	public void setSpecialEventName(String specialEventName) {
		this.specialEventName = specialEventName;
	}


	public void setItemNameofTicket(String itemNameofTicket) {
		this.itemNameofTicket = itemNameofTicket;
	}
}

//PlanDirector.java

package com.facaizhu;

//在这里PlanDirector,其实也就是Client
public class PlanDirector {
	public static void main(String[] args) {
		Builder builder = new VocationBuilder();
		
		builder.buildDay();
		builder.addRestaurant("XXX");
		builder.addSpecialEvent("Fly");
		
		Planner planner = builder.getVocationPlanner();
		
		planner.printPlan();
	}
}

//AnotherDirector.java

package com.facaizhu;

public class AnotherDirecotor {
	public static void main(String[] args) {
		Builder builder = new VocationBuilder();
		
		builder.buildDay();
		builder.addHotel("ZZZ");
		builder.addRestaurant("YYY");
		
		Planner planner = builder.getVocationPlanner();
		
		planner.printPlan();
	}
}

抱歉!评论已关闭.