java设计模式(5):建造模式(Builder)(一)

2014-11-23 23:13:44 · 作者: · 浏览: 2

GOF 给建造模式的定义为:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这句话说得很抽象,不好理解,其实它的意思可以理解为:将构造复杂对象的过程和组成对象的部件解耦。就像攒电脑一样,不管什么品牌的配件,只要兼容就可以装上;同样,一样的配件,可以有好多组装的方式。这是对降低耦合、提高可复用性精神的一种贯彻。


当要生成的产品有复杂的内部结构――比如由多个对象组成;而系统中对此产品的需求将来可能要改变产品对象的内部结构的构成,比如说产品的一些属性现在由一个小对象组成,而更改后的型号可能需要N 个小对象组成;而且不能将产品的内部构造完全暴露给客户程序,一是为了可用性,二是为了安全等因素。满足上面的设计环境就可以考虑使用建造模式来搭建框架了。

来看看建造模式的组成吧。

抽象建造者角色:这个角色用来规范产品对象的各个组成成分的建造。一般而言,此角色独立于应用程序的业务逻辑。具体建造者角色:担任这个角色的是于应用程序紧密相关的类,它们在指导者的调用下创建产品实例。这个角色在实现抽象建造者角色提供的方法的前提下,达到完成产品组装,提供成品的功能。指导者角色:调用具体建造者角色以创建产品对象。指导者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。产品角色:建造中的复杂对象。它要包含那些定义组件的类,包括将这些组件装配成产品的接口。


来看下这些角色组成的类图:

vcfJq6OssqK9q72o1OzV373Hyau0q8jr1ri1vNXfttTP87340NDF5NbDoaPIu7rzo6zWuLW81d+wtNXVsr3W6LX308O9qNTs1d+1xLe9t6i0tL2osvrGt6Gj1+6687/Nu6ezzNDytNO9qNTs1d+78tXf1ri1vNXfxMfA77XDtb2y+sa3oaM8L3A+CjxwPs7Sw8fV4sDvv7TSu7j2yrXP1qO6PC9wPgo8cD7O0sPH1qq1wMO9zOW/ydLUtObU2rK7zay1xLHttO/Qzsq9o6yxyMjnyum8rqGi1NPWvrrNzfjC56Gj1eK49sD919Ox7cq+srvNrNDOyr21xMO9zOW5udTstcSyvdboysfP4CYjMjAyODQ7tcSjrMv50tS/ydLUsbvM4cihtb3WuLW81d+9x8mr1tDIpaGjPC9wPgo8cD6yu82stcTDvczl0M7KvTo8L3A+CjxwPjwvcD4KPHByZSBjbGFzcz0="brush:java;">public class Media extends ArrayList { } public class Book extends Media { } public class Magazine extends Media { }
进而包含不同的媒体组成元素:

public class MediaItem {
	private String name;

	public MediaItem(String name) {
		this.name = name;
	}
	public String toString(){
		return name;
	}
}

public class Chapter extends MediaItem {
	public Chapter(String name) {
		super(name);
	}
}

public class Article extends MediaItem {
	public Article(String name) {
		super(name);
	}
}


抽象建造者角色,它规范了所有媒体建造的步骤:

public abstract class MediaBuilder {
	public abstract void buildBase();
	public abstract void addMediaItem(MediaItem m);
	public abstract Media getFinishedMedia();
}

具体建造者,建造书籍

public class BookBuilder extends MediaBuilder {
	private Book book;
	
	public void buildBase() {
		System.out.println("Building book framework");
		book = new Book();
	}

	public void addMediaItem(MediaItem chapter) {
		System.out.println("Adding chapter " + chapter);
		book.add(chapter);
	}

	public Media getFinishedMedia() {
		return book;
	}
}

具体建造者,建造杂志

public class MagazineBuilder extends MediaBuilder {
	private Magazine magazine;
	
	public void buildBase() {
		System.out.println("Building magazine framework");
		magazine = new Magazine();
	}

	public void addMediaItem(MediaItem article) {
		System.out.println("Adding chapter " + article);
		magazine.add(article);
	}

	public Media getFinishedMedia() {
		return magazine;
	}
}

指导者角色,也叫上下文

public class MediaDirector {
	private MediaBuilder mb;

	public MediaDirector(MediaBuilder mb) {
		this.mb = mb; // 具有策略模式相似特征的
	}

	public Media produceMedia(List input) {
		mb.buildBase();
		for (Iterator it = input.iterator(); it.hasNext();)
			mb.addMediaItem((MediaItem) it.next());
		return mb.getFinishedMedia();
	}
}

构建不同的媒体

public class Client {
	public static void main(String[] args) {
		List input = Arrays.asList(new MediaItem[] {
				new MediaItem("item1"), new MediaItem("item2"),
				new MediaItem("item3"), new MediaItem("item4"),
				});
		
		MediaDirector buildBook = new MediaDirector(new BookBuilder());
		M