嵌入式开发环境构建_设计模式:不可变的嵌入式构建器
嵌入式開(kāi)發(fā)環(huán)境構(gòu)建
上周,我寫了關(guān)于什么使圖案成為反圖案。 本周,我提出一種設(shè)計(jì)模式…或等待……也許這是一種反模式。 還是? 讓我們看看!
當(dāng)有一個(gè)類可以構(gòu)建另一個(gè)實(shí)例時(shí),構(gòu)建器模式是一種編程風(fēng)格。 構(gòu)建器模式的最初目的是將對(duì)象的構(gòu)建過(guò)程(在某些情況下可能非常復(fù)雜)與對(duì)象本身的類分開(kāi),因此構(gòu)建器可以根據(jù)構(gòu)建過(guò)程的進(jìn)行方式交付不同類型的對(duì)象。 這是關(guān)注點(diǎn)分離的明確示例。
不可變的對(duì)象是創(chuàng)建的對(duì)象,在創(chuàng)建過(guò)程后不能更改。
建造者和不可變的對(duì)象自然而然地融合在一起。
構(gòu)建器和構(gòu)建的對(duì)象緊密相關(guān),因此通常將它們放在同一程序包中。 但是為什么要在單獨(dú)的類中實(shí)現(xiàn)它們? 一方面:它們當(dāng)然必須是單獨(dú)的類。 這就是全部。 但是另一方面:為什么構(gòu)建器不能成為已構(gòu)建類的內(nèi)部類? Builder通常會(huì)以其自己的狀態(tài)收集建筑物信息,并且在調(diào)用方請(qǐng)求構(gòu)建對(duì)象時(shí),此信息將用于構(gòu)建已構(gòu)建的對(duì)象。 大多數(shù)情況下,這種“使用”是復(fù)制操作。 如果生成器是內(nèi)部類,則所有這些信息都可以存儲(chǔ)在生成的對(duì)象中。 注意,內(nèi)部類可以訪問(wèn)嵌入它的類的所有私有部分。 構(gòu)建器可以創(chuàng)建尚未準(zhǔn)備好的構(gòu)建對(duì)象,并將構(gòu)建信息存儲(chǔ)在其中。 當(dāng)要求建造所有東西時(shí),便是最后的油畫。
此模式后面是番石榴的不可變集合。 構(gòu)建器是靜態(tài)內(nèi)部類。 如果查看ImmutableList的代碼,您會(huì)發(fā)現(xiàn)抽象類內(nèi)部有一個(gè)內(nèi)部Builder類。
但這不是嵌入構(gòu)建器和實(shí)現(xiàn)的唯一方法。 如果將實(shí)現(xiàn)嵌入到生成器中怎么辦? 構(gòu)建器是唯一需要對(duì)類進(jìn)行可變?cè)L問(wèn)的代碼。 定義該類實(shí)現(xiàn)的查詢方法的接口對(duì)于其他任何人都應(yīng)該足夠。 如果我們到了這一點(diǎn),為什么不創(chuàng)建Matrjoschka?
讓我們有一個(gè)接口。 讓我們?cè)诮涌趦?nèi)部將一個(gè)生成器作為一個(gè)內(nèi)部類(默認(rèn)情況下為靜態(tài)和公共,不能以任何其他方式)。 讓我們將構(gòu)建器內(nèi)部的實(shí)現(xiàn)作為實(shí)現(xiàn)外部接口的私有靜態(tài)類。
public interface Knight {boolean saysNi();public class Builder {private Implementation implementation = new Implementation();public Builder setState(String say) {implementation.say = say;return this;}public Implementation build() {Implementation knight = implementation;implementation = null;return knight;}private static class Implementation implements Knight {private String say;public boolean saysNi() {return say.indexOf("ni") != -1;}}} }構(gòu)建器可以訪問(wèn)Knight實(shí)施的任何字段,因?yàn)樗鼈冊(cè)谕豁敿?jí)類中。 (JLS1.7,第6.6.1節(jié),確定可訪問(wèn)性)
除了使用生成器之外,沒(méi)有其他方法(討厭的反射技巧或字節(jié)碼濫用(目前已超出范圍))可以訪問(wèn)實(shí)現(xiàn)。
該構(gòu)建器可用于構(gòu)建實(shí)現(xiàn),一旦返回該實(shí)現(xiàn),就無(wú)法再訪問(wèn)它,無(wú)法通過(guò)該構(gòu)建器修改該實(shí)現(xiàn)。 如果實(shí)現(xiàn)是不可變的,則可以保證保存狀態(tài)。
這是圖案還是反圖案?
參考: 設(shè)計(jì)模式:來(lái)自Java博客Jeep的JCG合作伙伴 Peter Verhas的不可變嵌入式構(gòu)建器 。翻譯自: https://www.javacodegeeks.com/2014/02/design-pattern-immutable-embedded-builder.html
嵌入式開(kāi)發(fā)環(huán)境構(gòu)建
總結(jié)
以上是生活随笔為你收集整理的嵌入式开发环境构建_设计模式:不可变的嵌入式构建器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 转化成轮廓快捷键(轮廓预览的快捷键)
- 下一篇: 旧访客设计模式的新生活