前面兩篇文章中討論一下創(chuàng)建型設計模式的工廠模式、抽象工廠模式、單例模式,今天就繼續(xù)聊一聊創(chuàng)建型模式的剩下兩種,Builder模式和Prototype模式。
1、Builder模式
何為Builder模式,其實Builder模式比較好理解,就是將一個復雜對象的創(chuàng)建過程分解成幾個Step,而每個step又抽象出來。具體實現(xiàn)由每個子類自己來決定,在通過第三方的一個Driector類來實現(xiàn)組合Step的順序以達到最終的創(chuàng)建這個復雜的對象。
具體可以見如下的圖(from wiki):

從圖中,我們可以看到Director的Construct類用于將每個step構建起來,Builder中的buildPart()具體抽象了創(chuàng)建的過程由繼承類ConcreteBuilder的BuilderPart()來實現(xiàn)具體的構建。最終構建一個完整的Product。
后面在聊一下結合其他設計模式的理解,關于Builder和Abstract Factory。Builder主要是構造整理里面的每一個part。而Abstract Factory則是為了為統(tǒng)一類的Product提夠工廠。還有關于Build Part,個人倒是覺得可以結合工廠模式來做,這樣將每個part的實現(xiàn)由和ConcreteBuilder解耦合了,例如通過注入的方式來表明具體的實現(xiàn)。
突然想到,如果能把各種設計模式用的游刃有余那該是多么happy的一件事啊。
2、Prototype模式
和builder模式一樣,Prototype也同樣非常好理解,你可能經(jīng)常不經(jīng)意間就用到了它。例如你已經(jīng)有一個某個類的對象了,現(xiàn)在你需要創(chuàng)建一個和本對象相同的新對象。(請注意理解這里相同的意思哦)那該如何呢?基本上就會想到Clone()方法了。沒錯,clone()方法就是原型模式的實現(xiàn)。下面先看一下原型模式的結構圖(from 大話設計模式)

在原型模式中一般會要處理的就是深淺拷貝的問題,其實關于深淺拷貝也是比較好理解的。以java為例,java的內存分為四快:堆、棧、代碼區(qū)、數(shù)據(jù)區(qū)。對象的引用放在棧,對象放在堆。對于clone()毫無疑問,會重新開辟一個堆空間構建新對象。對于該對象的基本類型復制為原對象的值。那么對于類類型呢?有兩種方式:一種是同樣開辟一個空間存放該類類型(注意這是一個遞歸的過程),這就是所謂的深拷貝;還有一種則是只是引用指向原對象類類型的實例,此為淺拷貝。
關于深拷貝一定要注意就是,這是一個遞歸的過程。你必須保此類所包含的所有類(包括遞歸包含),都實現(xiàn)了深拷貝。還有就是要求父類對象也實現(xiàn)對象也實現(xiàn)了clone()方法,并完成深拷貝。而且在子類的clone()中調用super.clone()方法。
Ps:在java中一般實現(xiàn)Cloneable接口中的clone()方法即可。
pdf下載:/Files/zhenxuanpan/設計模式之Builder模式和Prototype模式.pdf