生活中有乙個常見的例子,沒有人買車會只買乙個輪胎或者方向盤,大家買的都是一輛包含輪胎和方向盤等多個部件的完整汽車。如何將這些部件組裝成一輛完整的汽車並返回給使用者呢,下面我們用程式來模擬一下這一過程。
1.首先是汽車、輪胎和方向盤三個實體類:
汽車類
/**
* 汽車
*/public class car ';
}// 省略getter/setter
}
輪胎類:
/**
* 輪胎
*/public class doughnut
@override
public string tostring() ';}}
方向盤類:
/**
* 方向盤
*/public class steeringwheel
@override
public string tostring() ';}}
2.然後我們直接生成汽車:
public class main
}
可以看到生成汽車的過程直接由我們客戶端來完成了,這樣就使得客戶端和各個類都有耦合。同時我們,可以看出生產汽車的過程其實是乙個比較流程化的事。而建造輪胎、方向盤等元件有可能是不盡相同的。並且,實際上建造輪胎和方向盤是較為麻煩的。基於此,接下來介紹建造者模式用於解決這一類問題。
建造者模式是設計模式的一種(建立型),將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。角色構成:uml類圖:
特點:
建造者模式是較為複雜的建立型模式,它將客戶端與包含多個組成部分(或部件)的複雜物件的建立過程分離,客戶端無須知道複雜物件的內部組成部分與裝配方式,只需要知道所需建造者的型別即可。它關注如何一步一步建立乙個的複雜物件,不同的具體建造者定義了不同的建立過程,且具體建造者相互獨立,增加新的建造者非常方便,無須修改已有**,系統具有較好的擴充套件性。
1.首先是三個實體類:因為和上面的實體類相同,就不貼**了
2.抽象構造者和兩個具體實現類:
/**
* 抽象構造者
*/public abstract class carbuilder
}
小轎車類:
/**
* 具體構造者:構造小轎車
*/public class sedancarbuilder extends carbuilder
public void builddoughnut()
}
貨車類:
/**
* 具體構造者:構造貨車
*/public class freightcarbuilder extends carbuilder
public void builddoughnut()
}
3.汽車生產指揮者:
/**
* 指揮者負責汽車的安裝過程
*/public class director
public car create()
}
3.客戶端使用:
/**
* 客戶端通過指揮者來獲取汽車
*/public class main
}
經過改造後,客戶端只需例項化指揮者類,指揮者類針對抽象建造者程式設計,客戶端根據需要傳入具體的建造者型別,指揮者將指導具體建造者一步一步構造乙個完整的產品(逐步呼叫具體建造者的buildx()
方法),相同的構造過程可以建立完全不同的產品。
public class main
}
下面是它的 uml 類圖結構:
通過上圖我們可以分析出:
已經是就建造者,只是不能例項化
stringbuilder
即充當了指揮者角色,同時也充當了具體的建造者,建造方法的實現是由abstractstringbuilder
完成。
1.主要優點:
2.主要缺點:
3.適用場景:
建造者模式
1.定義 將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。2.uml 類圖 結構 該結構 演示了複雜物件被一步一步建立的建造者模式。builder pattern structural example using system using system.collection...
建造者模式
軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c 寫了個小例子,加深一下理解。主要參考 大話設計模式 和 設...
建造者模式
建造者模式將複雜物件的構建和它的表示分離,使同樣的構建過程能夠構建出不同的表示。以乙個建造小人為例子,可以建造2種小人,胖子和瘦子 include using namespace std class builder 抽象建造者類 class buildthinman public builder 瘦...