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