1. 代理模式
應(yīng)用場景:當一個類的某些功能需要別的類去實現(xiàn)冒掌,但是又不確定哪個類來實現(xiàn)的時候板乙。
優(yōu)勢:解耦性
敏捷原則:開放-封閉原則
實例:tableView 數(shù)據(jù)源代理 delegate ,通過和protocol 的配合瞻惋,完成委托述求熄求。
2. 觀察者模式
應(yīng)用場景:一般是model 層對controller 和view 進行的通知方式,不關(guān)心誰去接收器贩,只負責發(fā)送测暗。
優(yōu)勢:解耦合
敏捷原則:接口隔離原則,開放-封閉原則
實例:notification 通知中心磨澡,注冊通知中心,任何位置可發(fā)送消息质和,注冊觀察者對象可以接收稳摄,kvo-鍵值對改變通知觀察者。
3. MVC 模式
應(yīng)用場景: 是一種古老的設(shè)計模式饲宿。通過數(shù)據(jù)模型厦酬,控制器邏輯,視圖展示將應(yīng)用程序進行邏輯劃分瘫想。
優(yōu)勢:使系統(tǒng)仗阅,層次清晰,職責分明国夜,易于維護减噪。
敏捷原則:對擴展開放-對修改封閉
實例:model - 即數(shù)據(jù)模型,view - 視圖展示车吹,controller - 進行UI展示和數(shù)據(jù)交互的邏輯控制筹裕。
4. 單利模式
應(yīng)用場景:確保程序運行期某個類只有一個實例,用于進行資源共享控制窄驹。
優(yōu)勢:使用簡單朝卒,眼石求值,易于跨模塊
敏捷原則:單一職責原則
實例:[UIApplication sharedApplication]乐埠。
注意事項:確保使用者只能通過getInstance 方法才能獲得抗斤,單例類的唯一實例。Java 丈咐、C++中使其沒有公有的構(gòu)造函數(shù)瑞眼,私有化并覆蓋其構(gòu)造函數(shù)。OC 中扯罐,重寫allocWithZone 方法负拟,保證即使用戶調(diào)用alloc 方法直接創(chuàng)建單利類的實例。返回的也只是此單例類的唯一靜態(tài)變量歹河。
單例會有什么弊端掩浙?
主要優(yōu)點:1.提供了唯一實例的受控訪問。2.由于在系統(tǒng)內(nèi)存中只存在一個對象秸歧,因此可以節(jié)約系統(tǒng)資源厨姚,對于一些需要頻繁創(chuàng)建和銷毀的對象單例模式無疑可以提高系統(tǒng)性能。3.允許可變數(shù)目的實例键菱。
主要缺點:1.由于單例模式中沒有抽象層谬墙,因此單例類的擴展有很大的困難。2.單例類的職責過重,在一定程度上違背了‘單一職責的原則’拭抬。3.濫用單例將帶來一些負面問題部默,如為了節(jié)省資源將數(shù)據(jù)庫連接池對象設(shè)計成單例類,可能會導致共享連接池對象的程序過多而出現(xiàn)連接池溢出造虎;如實例化的對象長時間不被利用傅蹂,系統(tǒng)會認為是垃圾而被回收,這將導致對象狀態(tài)丟失算凿。
5. 策略模式
應(yīng)用場景:定義算法簇份蝴,封裝起來,使他們之間可以互相替換氓轰。
優(yōu)勢:使算法的變化獨立于使用算法的用戶婚夫。
敏捷開發(fā):接口隔離原則、多用組合署鸡,少用繼承案糙、針對接口編程,而非實現(xiàn)储玫。
實例:排序算法侍筛,NSArray 的sortedArrayUsingSelector;經(jīng)典的鴨子會叫撒穷,會飛案例匣椰。
注意事項:1.剝離類中易于變化的行為,通過組合的方法嵌入抽象的基類端礼。2.變化的行為抽象基類的行為禽笑,所有可變變化的父類。3.用戶類的最終實例蛤奥,通過注入行為的方式佳镜,設(shè)定易變行為。 防止了繼承行為方式凡桥,導致無關(guān)行為污染子類蟀伸。完成了策略封裝和可替換性。
6. 工廠模式
應(yīng)用場景:工廠模式創(chuàng)建類的實例缅刽,多與proxy 模式配合啊掏,創(chuàng)建可替換性代理類。
優(yōu)勢:易于替換衰猛,面向抽象編程迟蜜,application 只與抽象工廠和易變類的共性抽象類發(fā)生調(diào)用管理。
敏捷原則:DIP 依賴倒置原則
實例:項目部署環(huán)境中依賴多個不同類型的數(shù)據(jù)庫時啡省,需要用工廠模式配合proxy 完成易用性替換娜睛。
注意事項:項目初期髓霞,軟件結(jié)構(gòu)和需求都沒有穩(wěn)定下來時,不建議使用此模式畦戒,因為其劣勢也和明顯方库;增加了代碼的復雜度,增加了調(diào)用層次障斋,增加了內(nèi)存負擔薪捍。所以要防止模式濫用。