日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

建造模式

系統(tǒng) 2005 0
?? 一、定義與結(jié)構(gòu)
GOF給建造模式的定義為:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。可以將建造模式的精髓概括為:將構(gòu)造復(fù)雜對(duì)象的過程和對(duì)象的部件解耦。這是對(duì)降低耦合、提高可復(fù)用性精神的一種貫徹。其實(shí)這種精神貫徹在GOF幾乎所有的設(shè)計(jì)模式中。

  是不是和上面提到的裝機(jī)流程相像?

  這個(gè)很多人認(rèn)為同抽象工廠模式相似的建造模式用在什么樣的設(shè)計(jì)環(huán)境下呢(對(duì)于兩者的比較稍候討論)?我認(rèn)為可以總結(jié)為以下環(huán)境:當(dāng)要生成的產(chǎn)品有復(fù)雜的內(nèi)部結(jié)構(gòu),其中的內(nèi)部結(jié)構(gòu)由多個(gè)對(duì)象組成;系統(tǒng)將來可能要改變產(chǎn)品對(duì)象的內(nèi)部結(jié)構(gòu)的構(gòu)成或者實(shí)現(xiàn)方式,比如說產(chǎn)品的一些屬性現(xiàn)在是從數(shù)據(jù)庫中得到的,而將來可能從XML中解析得到;而且不能將產(chǎn)品的內(nèi)部構(gòu)造完全暴露給客戶程序,一是為了可用性,二是為了安全等因素。滿足上面的設(shè)計(jì)環(huán)境就可以考慮使用建造模式來搭建框架了。 來看看建造模式的組成吧。

  抽象建造者角色:這個(gè)角色用來規(guī)范產(chǎn)品對(duì)象的各個(gè)組成成分的建造。一般而言,此角色獨(dú)立于應(yīng)用程序的商業(yè)邏輯。

  具體建造者角色:擔(dān)任這個(gè)角色的是于應(yīng)用程序緊密相關(guān)的類,它們?cè)谥笇?dǎo)者的調(diào)用下創(chuàng)建產(chǎn)品實(shí)例。這個(gè)角色在實(shí)現(xiàn)抽象建造者角色提供的方法的前提下,達(dá)到完成產(chǎn)品組裝,提供成品的功能。

  指導(dǎo)者角色:調(diào)用具體建造者角色以創(chuàng)建產(chǎn)品對(duì)象。指導(dǎo)者并沒有產(chǎn)品類的具體知識(shí),真正擁有產(chǎn)品類的具體知識(shí)的是具體建造者對(duì)象。 產(chǎn)品角色:建造中的復(fù)雜對(duì)象。它要包含那些定義組件的類,包括將這些組件裝配成產(chǎn)品的接口。

  來看下這些角色組成的類圖:

建造模式

  首先客戶程序創(chuàng)建一個(gè)指導(dǎo)者對(duì)象,一個(gè)建造者角色,并將建造者角色傳入指導(dǎo)者對(duì)象進(jìn)行配置。然后,指導(dǎo)者按照步驟調(diào)用建造者的方法創(chuàng)建產(chǎn)品。最后客戶程序從建造者或者指導(dǎo)者那里得到產(chǎn)品。

  從建造模式的工作流程來看,建造模式將產(chǎn)品的組裝“外部化”到了建造者角色中來。這是和任何正規(guī)的工廠模式不一樣的——產(chǎn)品的創(chuàng)建是在產(chǎn)品類中完成的。

  二、實(shí)現(xiàn)

  實(shí)在找不到太好的例子,我認(rèn)為《java與模式》中發(fā)郵件的例子還算可以。這里我將《Think in Patterns with Java》中的例子放到這里權(quán)且充個(gè)門面。媒體可以存在不同的表達(dá)形式,比如書籍、雜志和網(wǎng)絡(luò)。這個(gè)例子表示不同形式的媒體構(gòu)造的步驟是相似的,所以可以被提取到指導(dǎo)者角色中去。

import java.util.*;
import junit.framework.*;

//不同的媒體形式:

class Media extends ArrayList {}
class Book extends Media {}
class Magazine extends Media {}
class WebSite extends Media {}

// 進(jìn)而不含不同的媒體組成元素:

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

// 抽象建造者角色,它規(guī)范了所有媒體建造的步驟:

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

//指導(dǎo)者角色,也叫上下文
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();
 }
};

//測(cè)試程序——客戶程序角色

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

}

  在實(shí)現(xiàn)的時(shí)候,抽象建造角色提供的接口必須足夠普遍,以適應(yīng)不同的具體建造角色。對(duì)于一個(gè)建造角色來說可能某個(gè)步驟是不需要的,可以將此接口實(shí)現(xiàn)為空。多個(gè)產(chǎn)品之間可能沒有太多的共同點(diǎn),可以提供一個(gè)標(biāo)示接口作為抽象產(chǎn)品角色;也可以不提供抽象產(chǎn)品角色,這時(shí)要將提供產(chǎn)品的接口從抽象建造角色里面去掉,不然就會(huì)編譯出問題。

  三、應(yīng)用優(yōu)點(diǎn)

  建造模式可以使得產(chǎn)品內(nèi)部的表象獨(dú)立變化。在原來的工廠方法模式中,產(chǎn)品內(nèi)部的表象是由產(chǎn)品自身來決定的;而在建造模式中則是“外部化”為由建造者來負(fù)責(zé)。這樣定義一個(gè)新的具體建造者角色就可以改變產(chǎn)品的內(nèi)部表象,符合“開閉原則”。

  建造模式使得客戶不需要知道太多產(chǎn)品內(nèi)部的細(xì)節(jié)。它將復(fù)雜對(duì)象的組建和表示方式封裝在一個(gè)具體的建造角色中,而且由指導(dǎo)者來協(xié)調(diào)建造者角色來得到具體的產(chǎn)品實(shí)例。

  每一個(gè)具體建造者角色是毫無關(guān)系的。

  建造模式可以對(duì)復(fù)雜產(chǎn)品的創(chuàng)建進(jìn)行更加精細(xì)的控制。產(chǎn)品的組成是由指導(dǎo)者角色調(diào)用具體建造者角色來逐步完成的,所以比起其它創(chuàng)建型模式能更好的反映產(chǎn)品的構(gòu)造過程。

  四、擴(kuò)展

  建造模式中很可能要用到組成成品的各種組件類,對(duì)于這些類的創(chuàng)建可以考慮使用工廠方法或者原型模式來實(shí)現(xiàn),在必要的時(shí)候也可以加上單例模式來控制類實(shí)例的產(chǎn)生。但是要堅(jiān)持一個(gè)大前提就是要使引入的模式給你的系統(tǒng)帶來好處,而不是臃腫的結(jié)構(gòu)。 建造模式在得到復(fù)雜產(chǎn)品的時(shí)候可能要引用多個(gè)不同的組件,在這一點(diǎn)上來看,建造模式和抽象工廠模式是相似的。可以從以下兩點(diǎn)來區(qū)分兩者:創(chuàng)建模式著重于逐步將組件裝配成一個(gè)成品并向外提供成品,而抽象工廠模式著重于得到產(chǎn)品族中相關(guān)的多個(gè)產(chǎn)品對(duì)象;抽象工廠模式的應(yīng)用是受限于產(chǎn)品族的(具體參見《深入淺出工廠模式》),建造模式則不會(huì)。

  由于建造模式和抽象工廠模式在實(shí)現(xiàn)功能上相似,所以兩者使用的環(huán)境都比較復(fù)雜并且需要更多的靈活性。 建造模式中可能要使用到不同“大小”的組件類,因此這時(shí)也經(jīng)常和合成模式在一起使用。

建造模式


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 海口市| 云安县| 重庆市| 丹凤县| 旬邑县| 高要市| 托克逊县| 盐边县| 吕梁市| 偃师市| 吐鲁番市| 宜黄县| 泾阳县| 安陆市| 东明县| 简阳市| 昭觉县| 阿克陶县| 彭泽县| 肥西县| 沁源县| 永川市| 印江| 汉沽区| 漳州市| 宜良县| 卢氏县| 瓮安县| 砀山县| 海安县| 巫山县| 西充县| 元谋县| 确山县| 社旗县| 万州区| 沾化县| 大新县| 朝阳区| 南漳县| 项城市|