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

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

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