设计模式:建造者模式

定义:将一根复杂的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。

角色:抽象建造者,具体构造者,设计者(指导者),产品(房子)

 

设计模式:建造者模式

 

/**
 * 房子类  
 * 首先要描述下 房子要有些什么
 * 有哪些属性
 * 
 * @author tucheng
 *
 */
public class Room {
	private String window;	
	private String floor;
	public String getWindow() {
		return window;
	}
	public void setWindow(String window) {
		this.window = window;
	}
	public String getFloor() {
		return floor;
	}
	public void setFloor(String floor) {
		this.floor = floor;
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "---->floor  "+floor+"   window   "+window;
	}
	
}



-----------------------------------------------------


/**
 * 建造者角色
 * 工人接口,定义了各个工人所需要进行的工作
 * 并不负责具体的建造
 * 
 * 同时房子是具体的(农民工)建造的  所以需要有返回房子的方法
 * @author tucheng
 *
 */
public interface Build {
	public void makeWindow();
		
	public void  makeFloor();
	
	public Room getRoom();
	
}



--------------------------------------------------------------


public class WorkBuilder  implements Build{
	private Room room=new Room();
	@Override
	public void makeWindow() {
		room.setFloor("地板  ");
	}

	@Override
	public void makeFloor() {
		room.setWindow("窗户");
	}

	@Override
	public Room getRoom() {
		return room;
	}

}



-------------------------------------------------------------------

/**
 * 指导者 角色
 * 所具备的能力
 * 
 * 设计师  他知道房子怎么设计
 * 他会指挥工人去建造
 * 实际生活中  大厦的设计者并不会看大厦的具体实现细节
 * 更多的是从整体角度出发,指挥这个工人团队建造
 * 所以他肯定对工人所具备的能力和行为有很深的了解
 * 换做程序代码中 ,他也肯定会持有工人 的这个对象的引用
 * 
 * 
 * @author tucheng
 *
 */
public class Designer {
	
	public void order(Build build)
	{
		build.makeFloor();
		build.makeWindow();
	}
	
}


--------------------------------------------------------------

public class Client {
	  public static void main(String[] args) {    
		     Build worker = new WorkBuilder(); //获取工人对象   
		     Designer  designer = new  Designer();   //获取设计师对象 
		     designer.order(worker);    //设计师指挥工人工作
		     System.out.println(worker.getRoom());;   //工人交房 
		  }  
}


------------------------------------------------------------------

 

 

上面是标准的构造者模式,实际使用过程中经常把designe删除。上面有个弊端client 可以执行rome的方法

/**
 * 房子类  
 * 首先要描述下 房子要有些什么
 * 有哪些属性
 * 
 * @author tucheng
 *
 */
public class Room {
	private String window;	
	private String floor;
	private String doorl;
	private String  chat;
	public void apply(WorkBuilder.RoomParmas parmas)
	{
		window=parmas.window;
		floor=parmas.floor;
		doorl=parmas.door;
		chat=parmas.chat;
	}
	public void setChat(String chat) {
		this.chat = chat;
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "---->floor  "+floor+"   window   "+window;
	}
	public void show()
	{
		
	}
	
}


-----------------------------------------------------------------------

public class WorkBuilder{
	private RoomParmas parmas;
	
	
	public WorkBuilder( ) {
		this.parmas = new RoomParmas();
	}

	public  WorkBuilder makeWindow(String window ) {
		parmas.window=window;
		return this;
	}

	public WorkBuilder makeFloor(String floorCorlor) {
		parmas.floor=floorCorlor;
		return this;
	}
	public WorkBuilder makeDoor(String door) {
		parmas.door=door;
		return this;
	}
	public Room makeChat(String  chat) {
		parmas.chat=chat;
		Room room=new Room();
		return room;
	}
	public  void show()
	{
		
	}
	public Room build() {
		Room room=new Room();
		room.apply(parmas);
		return room;
	}
	
	
	class RoomParmas
	{
		public  String window;	
		public String floor;
		public String door;
		public String  chat;
		
	}

}


---------------------------------------------------------------


public class Client {
	  public static void main(String[] args) {    
		     Room room=(new WorkBuilder()).makeWindow("蓝色玻璃").makeFloor("黄色地板").makeChat("").show();; //获取工人对象   
		     System.out.println(room);;   //工人交房 
		  }  
}





android中用到这种模式的是AlertDialog。