建造者模式

学习笔记



建造者模式:


概念基本来自:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/19/2599980.html

将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。


建造者模式的本质和建造楼房是一致的:即流程不变,但每个流程实现的具体细节则是经常变化的。建造者模式的好处就是 保证了流程不会变化,流程即不会增加、也不会遗漏或者产生流程次序错误,这是非常重要的。


建造者模式通常包括下面几个角色:

1. builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。

2. ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。

3. Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

4. Product:要创建的复杂对象。


建造者模式的结构图:








具体实现:

   Build.java(抽象建造者)   WorkBuild.java(具体建造者)    Designer.java(设计者)    Room.java(产品)  



Build.java

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


WorkBuilder.java


package com.dongnao.build;

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;
	}

}


Designer.java

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

}


Room.java


package com.dongnao.build;
/**
 * 房子类  
 * 首先要描述下 房子要有些什么
 * 有哪些属性
 * 
 * @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;
	}
	
}



外部调用:

  Client.java

package com.dongnao.build;

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());;   //工人交房 
		  }  
}


上面是标准的建造者模式,不过在实际开发中,使用标准建造者模式的都不多,一般都是使用其变形

 WorkBuilder.java   Room.java

无抽象建造者,无设计者

 WorkBuilder.java

package com.dongnao.build.noddesigner;

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;
		
	}

}



Room.java


package com.dongnao.build.noddesigner;
/**
 * 房子类  
 * 首先要描述下 房子要有些什么
 * 有哪些属性
 * 
 * @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()
	{
		
	}
	
}



外部调用


Client.java


package com.dongnao.build.noddesigner;

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



Room中的所有属性都私有化,在WorkBuilder中存在一个内部类(Room所有属性的备份),要对Room属性进行赋值其实是通过给WorkBuilder中内部类的属性赋值来间接完成的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值