移动架构之建造者模式

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式

建造者模式中的角色

抽象建造者:给出一个抽象接口,定义了需要进行的工作,就像指导手册一样
具体建造者:具体的建造者完成抽象方法,返回对象
设计者(指导者):所有提出的需求在设计者这个类里面都能找得到
产品:制造出来的产品

使用场景

  • 需要生成的对象具有复杂的内部结构
  • 需要生成的对象内部属性本身相互依赖

与工厂模式的区别:建造者模式更加关注与零件装配的顺序

实例说明

以建造一个房子为例
抽象建造者

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

设计者

public class Designer {
	
	public void order(Build build) {
		build.makeFloor();
		build.makeWindow();
	}
}

产品

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() {
		return "floor: " + floor + ", window: " + window;
	}
}

测试类

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

建造者模式的常用方式

在建造者模式中,在实际运用的时候往往会省略掉设计者这个角色
其主要是考虑到不向外暴露太多实现细节
使用链式构建,使得对外隐藏所有细节,这也是build采用的设计思想

public class Room {

	private String window;	
	private String floor;

	public void apply(WorkBuilder.RoomParmas parmas)
	{
		window=parmas.window;
		floor=parmas.floor;
	}

	@Override
	public String toString() {
		return "floor: " + floor + ", window: " + window;
	}
}
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 Room build() {
		Room room = new Room();
		room.apply(parmas);
		return room;
	}

	class RoomParmas {
		public String window;	
		public String floor;
	}
}
public class Client {
	public static void main(String[] args) {    
		Room room = (new WorkBuilder()).makeWindow("玻璃")
						.makeFloor("地板").build();   
		System.out.println(room);
	}  
}
posted @ 2019-04-06 21:22  cj5785  阅读(120)  评论(0编辑  收藏  举报