Factory:
標準設計模式中存在兩種原廠模式,可以參見下面這兩個地址,裡面有詳細的介紹。
Factory
http://blog.csdn.net/cjjky/article/details/7314118
Abstract Factory
http://blog.csdn.net/cjjky/article/details/7346893
其要點都在於Client只關心抽象工廠和抽象產品,而不關心具體的工廠和工廠建立出來的具體的產品是什麼。
另外,對Android中存在的Factory進行了整理,大概分了兩類:
一類是產品唯一且固定的,與標準的原廠模式定義不一樣,但也算是對原廠模式的活學活用。
SSLCertificateSocketFactory
Socket createSocket(String host, int port, InetAddress localAddr, int localPort)
Socket createSocket(InetAddress addr, int port)
BitmapFactory
Bitmap decodeByteArray(byte[] data, int offset, int length, BitmapFactory.Options opts)
Bitmap decodeByteArray(byte[] data, int offset, int length)
Bitmap decodeFile(String pathName)
另一類是算是標準的原廠模式。Android定義了抽象工廠ViewSwitcher.ViewFactory和ViewSwitcher.ViewFactory,還定義了抽象產品View
ViewSwitcher.ViewFactory
View makeView()
LayoutInflater.Factory
View onCreateView(String name, Context context, AttributeSet attrs)
Builder:
參見:http://blog.csdn.net/cjjky/article/details/7327200
標準設計模式中的Builder規定由抽象Builder把構建對象的各個步驟定義好抽象方法,具體實作類別Builder去實現這些抽象方法,從而構造出不同的對象。
而Android中的Builder模式稍稍變通了一下,沒有抽象Builder角色,直接為一個對象配備了固定的Builder,然後在Builder中把構造對象的步驟開放出來,由使用者分步調用。如:
AlertDialog.Builder
Notification.Builder
Uri.Builder
Stategy:
參見:http://blog.csdn.net/cjjky/article/details/7322688
每一個具體的Interpolator都代表一個具體的演算法。Interpolator類對它們進行了抽象,扮演了一個Strategy角色。而Animator算是使用Strategy的Context。
Proxy:
參見:http://blog.csdn.net/cjjky/article/details/7330657
代理模式的四種應用場合:
第一:遠程代理,也就是為一個對象在不同的地址空間提供局部代表,這樣可以隱藏一個對象存在於不同地址空間的事實。
第二:虛擬代理,是根據需要建立開銷很大的對象,通過它來存放執行個體化需要很長時間的真實對象。
第三:安全代理,用來控制真實對象訪問時的許可權。
第四:智能引用,是指當調用真實對象時,代理處理另外一些事。
Android中的AIDL屬於第一種應用。
Observer:
參見:http://blog.csdn.net/cjjky/article/details/7384951
模式的應用情境及特點
1、多個不同的對象都對同一個對象的狀態改變感興趣。
2、對象之間要求很鬆散的耦合時使用。
3、可以向Observerable中添加/刪除Observer
4、Observerable對Observer的數量不做限制,有狀態改變時通知所有的Observer。
Decorator:
參見:http://blog.csdn.net/cjjky/article/details/7478788
個人見解:
除模式本身定義的情境外,還比較適用於被封裝的類不能繼承、不瞭解細節的情況。比如從Resolver中擷取到系統的Cursor時,實際只取到了Cursor這個介面,如果想擴充Cursor的功能而又不改變介面,只有Decorator最合適。這種情況下是無法繼承的。
Facade:
參見:http://blog.csdn.net/cjjky/article/details/7570632
實現一個功能需要先調用A的a方法,再調用B的b方法,再調用C的c方法時,可以定義一個Facade類,在裡麵包含了對a,b,c的調用集合。這樣外部使用一個Facade就可以了。
State:
參見:http://blog.csdn.net/cjjky/article/details/7585207
當控制一個對象狀態轉換的條件運算式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把複雜的判斷邏輯簡化。當一個對象的行為取決於它的狀態,並且它必須在運行時刻根據狀態改變它的行為時,就可以考慮使用狀態模式了。