前言
設計模式(Design pattern)代表了最佳的實踐,通常被有經驗的面向對象的軟件開發人員所采用。設計模式是軟件開發人員在軟件開發過程中面臨的一般問題的解決方案。這些解決方案是眾多軟件開發人員經過相當長的一段時間的試驗和錯誤總結出來的。
設計模式是一套被反復使用的、多數人知曉的、代碼設計經驗的總結。使用設計模式是為了重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 毫無疑問,設計模式于己于他人于系統都是多贏的,設計模式使代碼編制真正工程化,設計模式是軟件工程的基石,如同大廈的一塊塊磚石一樣。項目中合理地運用設計模式可以完美地解決很多問題,每種模式在現實中都有相應的原理來與之對應,每種模式都描述了一個在我們周圍不斷重復發生的問題,以及該問題的核心解決方案,這也是設計模式能被廣泛應用的原因。
設計模式又可以劃分為三類。創建型模式:?這些設計模式提供了一種在創建對象的同時隱藏創建邏輯的方式,而不是使用 new 運算符直接實例化對象。這使得程序在判斷針對某個給定實例需要創建哪些對象時更加靈活。結構性模式:?這些設計模式關注類和對象的組合。繼承的概念被用來組合接口和定義組合對象獲得新功能的方式。行為型模式:?這些設計模式特別關注對象之間的通信。
創建型模式
工廠模式(Factory Pattern)
抽象工廠模式(Abstract Factory Pattern)
單例模式(Singleton Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)
結構型模式
適配器模式(Adapter Pattern)
橋接模式(Bridge Pattern)
過濾器模式(Filter、Criteria Pattern)
組合模式(Composite Pattern)
裝飾器模式(Decorator Pattern)
外觀模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
行為型模式
責任鏈模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解釋器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
備忘錄模式(Memento Pattern)
觀察者模式(Observer Pattern)
狀態模式(State Pattern)
空對象模式(Null Object Pattern)
策略模式(Strategy Pattern)
模板模式(Template Pattern)
訪問者模式(Visitor Pattern)
設計模式六大設計原則
1、單一職責原則(Single Responsibility Principle, SRP):
一個類只負責一個功能領域中的相應職責,或者可以定義為:就一個類而言,應該只有一個引起它變化的原因。
2、開閉原則(Open-Closed Principle, OCP):
一個軟件實體應當對擴展開放,對修改關閉。即軟件實體應盡量在不修改原有代碼的情況下進行擴展。
3、里氏代換原則(Liskov Substitution Principle, LSP):
所有引用基類(父類)的地方必須能透明地使用其子類的對象。
4、依賴倒轉原則(Dependency Inversion Principle, DIP):
抽象不應該依賴于細節,細節應當依賴于抽象。換言之,要針對接口編程,而不是針對實現編程。
5、接口隔離原則(Interface Segregation Principle, ISP):
使用多個專門的接口,而不使用單一的總接口,即客戶端不應該依賴那些它不需要的接口。
6、迪米特法則(Law of Demeter, LoD):
實體應當盡可能少地與其他實體發生相互作用。
簡單工廠模式
拿水果與廠商為例子,當顧客跟廠商說我要買多少多少蘋果的時候,廠商就會經過一系列動作然后給到顧客需要的一定量的蘋果,也即是當顧客想要什么水果的時候,就說什么水果的名字,顧客不需要操心自己需要經過什么樣的處理過程,才能夠得到想要的水果,生產水果的這一系列都由廠商來完成。
水果類
提供三個方法獲取水果的名字、顏色以及重量。
蘋果類
香蕉類
水果工廠類
客戶端使用
水果工廠的靜態方法,createFruit(String fruirName)根據提供的水果名稱,創建對應的水果對象。
以上就是簡單工廠模式的實現。說說它的優點,為什么要用它,原因很簡單,解耦,通過這樣的方式,把對象的創建和對象本身使用分離出來,降低了系統的耦合度。明確了功能的模塊的職責和權利。通過工廠類,外部只需要得到對象去使用而不必關心如何創建的對象的邏輯。
缺點:1. 創建產生對象的所有邏輯都在一個地方,每出現一個新的類,必須修改工廠類,違反了開閉原則。2. 當新的類越來越多的時候,對產品的判斷就會越來越多,不利于系統的拓展以及維護。
針對違反開閉原則的那一點,可以通過反射來解決每當有新的類就要修改工廠類,通過傳遞類的路徑來創建對象,為了拓展,傳遞的類的路徑可以存放在一個常量類,又或者是通過配置文件的手段來保存,這樣一來,即使類路徑變了,也只需要改變一處,而不需要改變多處。