`

建造模式

阅读更多
建造模式是将负责对象的构建与它的表示分离开来,从而可以达到同样的创建过程可以创建不同的表示。简单的讲就是将构造过程与组装的过程进行解耦。
注:构造过程是一样的,但是由于传入零件不同组装的产品也就不一样。
如构造的步骤定义在抽象的构造者中,具体构造者1生产出了各自汽车的零件,然后按照抽象构造者的步骤构造出了汽车。而构造者2生产出了火车的零件。然后按照抽象构造者生产出了火车。
这样导演者调用构造者1生产出汽车。调用构造者2生产出火车。
组成角色:抽象构造者、具体构造者、指导者、产品。
步骤:首先创建一个指导者,然后创建一个创建者,并将创建者传入给指导者对象进行配置。然后指导者按照创建者提供的方法创建产品。最后客户端从指导者那得到产品。
实例:
import java.util.*;
import junit.framework.*;
//不同的媒体形式:
class Media extends ArrayList {}
class Book extends Media {}//对应的产品,会关联到具体的构造者中
class Magazine extends Media {}
class WebSite extends Media {}
// 进而包含不同的媒体组成元素:
class MediaItem {//对应的产品组成元素
private String s;
public MediaItem(String s) { this.s = s; }
public String toString() { return s; }
}
class Chapter extends MediaItem {
public Chapter(String s) { super(s); }
}
class Article extends MediaItem {
public Article(String s) { super(s); }
}
class WebItem extends MediaItem {
public WebItem(String s) { super(s); }
}
// 抽象建造者角色,它规范了所有媒体建造的步骤:
class MediaBuilder {
public void buildBase() {}
public void addMediaItem(MediaItem item) {}
public Media getFinishedMedia() { return null; }
}
//具体建造者角色
class BookBuilder extends MediaBuilder {
private Book b;
public void buildBase() {
System.out.println("Building book framework");
b = new Book();
}
public void addMediaItem(MediaItem chapter) {
System.out.println("Adding chapter " + chapter);
b.add(chapter);
}
public Media getFinishedMedia() { return b; }
}
class MagazineBuilder extends MediaBuilder {
private Magazine m;
public void buildBase() {
System.out.println("Building magazine framework");
m = new Magazine();
}
public void addMediaItem(MediaItem article) {
System.out.println("Adding article " + article);
m.add(article);
}
public Media getFinishedMedia() { return m; }
}
class WebSiteBuilder extends MediaBuilder {
private WebSite w;//选用组合的方式将构造者与对应的生产产品绑定
public void buildBase() {
System.out.println("Building web site framework");
w = new WebSite();//实例化产品对象
}
public void addMediaItem(MediaItem webItem) {
System.out.println("Adding web item " + webItem);
w.add(webItem);//添加产品所需的组成部件
}
public Media getFinishedMedia() { return w; }//返回组装完成的产品
}
//指导者角色,也叫上下文
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 BuildMedia extends TestCase {
private List input = Arrays.asList(new MediaItem[] {//创建产品零件数组
new MediaItem("item1"), new MediaItem("item2"),
new MediaItem("item3"), new MediaItem("item4"),
});
public void testBook() {
//创建指导者,通过指导者获取对应的产品
MediaDirector buildBook = new MediaDirector(new BookBuilder());//获取操作书籍构造者的指导者
Media book = buildBook.produceMedia(input);//添加书籍所需的组成元素
String result = "book: " + book;
System.out.println(result);
assertEquals(result, "book: [item1, item2, item3, item4]");
}
public void testMagazine() {
MediaDirector buildMagazine = new MediaDirector(new MagazineBuilder());
Media magazine = buildMagazine.produceMedia(input);
String result = "magazine: " + magazine;
System.out.println(result);
assertEquals(result, "magazine: [item1, item2, item3, item4]");
}
public void testWebSite() {
MediaDirector buildWebSite = new MediaDirector(new WebSiteBuilder());
Media webSite = buildWebSite.produceMedia(input);
String result = "web site: " + webSite;
System.out.println(result);
assertEquals(result, "web site: [item1, item2, item3, item4]");
}
public static void main(String[] args) {
junit.textui.TestRunner.run(BuildMedia.class);
}
}
总结:建造模式使得客户不需要知道太多产品内部的细节。它将复杂对象的组建和表示方式封
装在一个具体的建造角色中,而且由指导者来协调建造者角色来得到具体的产品实例。
建造模式中很可能要用到组成成品的各种组件类,对于这些类的创建可以考虑使用工厂
方法或者原型模式来实现,在必要的时候也可以加上单例模式来控制类实例的产生
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics