2004-05-25
每次看設(shè)計(jì)模式這本書的時(shí)候都有著相同的感覺,上次沒有真的理解,這次才是理解了,但是還差那么一點(diǎn)點(diǎn)。
人其實(shí)挺奇怪的,這些模式在編程的幾年之內(nèi),無論是具體的項(xiàng)目中還是自己的練習(xí)中,都使用了很多,只是沒有作為一種模式總結(jié)出來而已,而是以經(jīng)驗(yàn)的形式存在于腦海之中,隨意的使用,隨意的忘卻。
可能就是必然的學(xué)習(xí)過程吧,隨意使用--形成模式--突破模式靈活應(yīng)用。而模式在這里起著把經(jīng)驗(yàn)持久化的作用吧,減少忘卻的可能。
所以,真正的掌握模式,除了需要理解模式的表現(xiàn)之外,需要理解模式著力解決的問題,理解模式的缺陷和優(yōu)勢,才能做到最終靈活抽取各個(gè)模式之長而靈活組合之,這可能就是我在模式領(lǐng)域追求的無招勝有招的境界吧。
模式的核心目的大多是兩種之一:重用和解耦
言歸正傳,還是來說說具體的模式吧:Design patterns
模式分類:構(gòu)建型模式
模式一:抽象工廠(Abstract Factory)
Factory理解為對象工廠的概念,用以生成一個(gè)系列的對象組。
而Abstract Factory就是基于Factory之上的概念,目的是把多個(gè)系列的對象組抽取共性,屏蔽不同系列之間的對象的差異。
?系列???? motif?????? windows?
對象組
Button??? motifBtn??? wBtn
Bar?????? motifBar????wBar
Textbox?? motifTB???? wTB
class abstractFactory{
?Button getButton();
?Bar getBar();
?Textbox getTextbox();
}
button,bar,textbox是一組對象,而我們需要實(shí)現(xiàn)motif,windows等不同系列風(fēng)格的對象組,Abstract Factory提供的方式下,我們對于大多應(yīng)用程序而言,操作的口是abstractFactory,以及Button,Bar,Textbox這些對象組,而無需具體關(guān)心是motif風(fēng)格還是windows風(fēng)格的,風(fēng)格系列的指定只決定于實(shí)現(xiàn)abstractFactory的具體工廠類。
這種方法便于這種系列的增加,但是并不有利于對象組成員的增加,比如要增加一個(gè)label對象,我們就需要增加一個(gè)抽象對象Lable,還需要修改abstractFactory以及他所有的子類。
所以使用這種方法的時(shí)候,最重要的是對象組的規(guī)劃設(shè)計(jì)。
模式二:生成器(builder)
生成器的概念是提供一系列的方法生成對象的不同部分,最終返回一個(gè)完整的對象,著力于解決將構(gòu)造方法和構(gòu)造步驟分離的問題,builder內(nèi)部封裝的是構(gòu)建方法而不是過程。
做了這樣的分離之后,再將builder做一個(gè)抽象,從而使得不同的構(gòu)建方法和構(gòu)建過程做到分離。
假設(shè)一個(gè)串的存儲(chǔ)管理:
class builder(){
?add(key,value);
?addStr(str);
}
同樣的操作集合,
add(key,value),addStr(str)
對于不同的builder,可能輸出的結(jié)果就會(huì)有多種:
key=value;str
另一種可能:
?value
?str
模式三:工廠方法(Factory)
其實(shí)他的另一個(gè)名字更加能夠說明問題(虛構(gòu)造)
也就是說通過抽象類的共同方法來避免構(gòu)造時(shí)的硬編碼,
如:button對象有個(gè)getBtn的方法,
就可以避免寫出button btn = new motifButton();這樣的代碼,而將這樣的代碼封裝到了子類自身。
模式四:原型法(prototype)
就是在應(yīng)用時(shí)并不是創(chuàng)建一個(gè)新的對象,而是從已有的對象中拷貝一個(gè)。
這種方式我在做配置池的時(shí)候用到過,每個(gè)業(yè)務(wù)程序從我的池中去拷貝一個(gè)對象,然后才進(jìn)行相關(guān)的修改和應(yīng)
用。
這種方式同樣是動(dòng)態(tài)創(chuàng)建類的方法,著重于解決當(dāng)對象組的成員不穩(wěn)定的情況,而不是多個(gè)系列的問題。
與Factory相比,他并不是每一個(gè)原型都需要一個(gè)構(gòu)建子類。
缺點(diǎn):clone本身實(shí)現(xiàn)的難度。
模式五:單件(singleton)
這種模式使用無數(shù),就不再多說了。用于保證實(shí)例的唯一性。