嵌入式开发环境构建_设计模式:不可变的嵌入式构建器
嵌入式開發環境構建
上周,我寫了關于什么使圖案成為反圖案。 本周,我提出一種設計模式…或等待……也許這是一種反模式。 還是? 讓我們看看!
當有一個類可以構建另一個實例時,構建器模式是一種編程風格。 構建器模式的最初目的是將對象的構建過程(在某些情況下可能非常復雜)與對象本身的類分開,因此構建器可以根據構建過程的進行方式交付不同類型的對象。 這是關注點分離的明確示例。
不可變的對象是創建的對象,在創建過程后不能更改。
建造者和不可變的對象自然而然地融合在一起。
構建器和構建的對象緊密相關,因此通常將它們放在同一程序包中。 但是為什么要在單獨的類中實現它們? 一方面:它們當然必須是單獨的類。 這就是全部。 但是另一方面:為什么構建器不能成為已構建類的內部類? Builder通常會以其自己的狀態收集建筑物信息,并且在調用方請求構建對象時,此信息將用于構建已構建的對象。 大多數情況下,這種“使用”是復制操作。 如果生成器是內部類,則所有這些信息都可以存儲在生成的對象中。 注意,內部類可以訪問嵌入它的類的所有私有部分。 構建器可以創建尚未準備好的構建對象,并將構建信息存儲在其中。 當要求建造所有東西時,便是最后的油畫。
此模式后面是番石榴的不可變集合。 構建器是靜態內部類。 如果查看ImmutableList的代碼,您會發現抽象類內部有一個內部Builder類。
但這不是嵌入構建器和實現的唯一方法。 如果將實現嵌入到生成器中怎么辦? 構建器是唯一需要對類進行可變訪問的代碼。 定義該類實現的查詢方法的接口對于其他任何人都應該足夠。 如果我們到了這一點,為什么不創建Matrjoschka?
讓我們有一個接口。 讓我們在接口內部將一個生成器作為一個內部類(默認情況下為靜態和公共,不能以任何其他方式)。 讓我們將構建器內部的實現作為實現外部接口的私有靜態類。
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;}}} }構建器可以訪問Knight實施的任何字段,因為它們在同一頂級類中。 (JLS1.7,第6.6.1節,確定可訪問性)
除了使用生成器之外,沒有其他方法(討厭的反射技巧或字節碼濫用(目前已超出范圍))可以訪問實現。
該構建器可用于構建實現,一旦返回該實現,就無法再訪問它,無法通過該構建器修改該實現。 如果實現是不可變的,則可以保證保存狀態。
這是圖案還是反圖案?
參考: 設計模式:來自Java博客Jeep的JCG合作伙伴 Peter Verhas的不可變嵌入式構建器 。翻譯自: https://www.javacodegeeks.com/2014/02/design-pattern-immutable-embedded-builder.html
嵌入式開發環境構建
總結
以上是生活随笔為你收集整理的嵌入式开发环境构建_设计模式:不可变的嵌入式构建器的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 转化成轮廓快捷键(轮廓预览的快捷键)
- 下一篇: 工业电脑主板的图解及功能图(工业电脑主板
