1. 代理模式
應用場景:當一個類的某些功能需要別的類去實現,但是又不確定哪個類來實現的時候。
優勢:解耦性
敏捷原則:開放-封閉原則
實例:tableView 數據源代理 delegate ,通過和protocol 的配合,完成委托述求。
2. 觀察者模式
應用場景:一般是model 層對controller 和view 進行的通知方式,不關心誰去接收,只負責發送。
優勢:解耦合
敏捷原則:接口隔離原則,開放-封閉原則
實例:notification 通知中心,注冊通知中心,任何位置可發送消息,注冊觀察者對象可以接收,kvo-鍵值對改變通知觀察者。
3. MVC 模式
應用場景: 是一種古老的設計模式。通過數據模型,控制器邏輯,視圖展示將應用程序進行邏輯劃分。
優勢:使系統,層次清晰,職責分明,易于維護。
敏捷原則:對擴展開放-對修改封閉
實例:model - 即數據模型,view - 視圖展示,controller - 進行UI展示和數據交互的邏輯控制。
4. 單利模式
應用場景:確保程序運行期某個類只有一個實例,用于進行資源共享控制。
優勢:使用簡單,眼石求值,易于跨模塊
敏捷原則:單一職責原則
實例:[UIApplication sharedApplication]。
注意事項:確保使用者只能通過getInstance 方法才能獲得,單例類的唯一實例。Java 、C++中使其沒有公有的構造函數,私有化并覆蓋其構造函數。OC 中,重寫allocWithZone 方法,保證即使用戶調用alloc 方法直接創建單利類的實例。返回的也只是此單例類的唯一靜態變量。
單例會有什么弊端?
主要優點:1.提供了唯一實例的受控訪問。2.由于在系統內存中只存在一個對象,因此可以節約系統資源,對于一些需要頻繁創建和銷毀的對象單例模式無疑可以提高系統性能。3.允許可變數目的實例。
主要缺點:1.由于單例模式中沒有抽象層,因此單例類的擴展有很大的困難。2.單例類的職責過重,在一定程度上違背了‘單一職責的原則’。3.濫用單例將帶來一些負面問題,如為了節省資源將數據庫連接池對象設計成單例類,可能會導致共享連接池對象的程序過多而出現連接池溢出;如實例化的對象長時間不被利用,系統會認為是垃圾而被回收,這將導致對象狀態丟失。
5. 策略模式
應用場景:定義算法簇,封裝起來,使他們之間可以互相替換。
優勢:使算法的變化獨立于使用算法的用戶。
敏捷開發:接口隔離原則、多用組合,少用繼承、針對接口編程,而非實現。
實例:排序算法,NSArray 的sortedArrayUsingSelector;經典的鴨子會叫,會飛案例。
注意事項:1.剝離類中易于變化的行為,通過組合的方法嵌入抽象的基類。2.變化的行為抽象基類的行為,所有可變變化的父類。3.用戶類的最終實例,通過注入行為的方式,設定易變行為。 防止了繼承行為方式,導致無關行為污染子類。完成了策略封裝和可替換性。
6. 工廠模式
應用場景:工廠模式創建類的實例,多與proxy 模式配合,創建可替換性代理類。
優勢:易于替換,面向抽象編程,application 只與抽象工廠和易變類的共性抽象類發生調用管理。
敏捷原則:DIP 依賴倒置原則
實例:項目部署環境中依賴多個不同類型的數據庫時,需要用工廠模式配合proxy 完成易用性替換。
注意事項:項目初期,軟件結構和需求都沒有穩定下來時,不建議使用此模式,因為其劣勢也和明顯;增加了代碼的復雜度,增加了調用層次,增加了內存負擔。所以要防止模式濫用。