開閉原則的意思是:對擴展開放,對修改關閉。在程序須要進行拓展的時候,不能去修改原有的代碼,實現一個熱插拔的效果。簡言之,是爲了使程序的擴展性好,易於維護和升級。想要達到這樣的效果,咱們須要使用接口和抽象類,後面的具體設計中咱們會提到這點。java
里氏代換原則是面向對象設計的基本原則之一。 里氏代換原則中說,任何基類能夠出現的地方,子類必定能夠出現。LSP 是繼承複用的基石,只有當派生類能夠替換掉基類,且軟件單位的功能不受到影響時,基類才能真正被複用,而派生類也可以在基類的基礎上增長新的行爲。里氏代換原則是對開閉原則的補充。實現開閉原則的關鍵步驟就是抽象化,而基類與子類的繼承關係就是抽象化的具體實現,因此里氏代換原則是對實現抽象化的具體步驟的規範。算法
這個原則是開閉原則的基礎,具體內容:針對接口編程,依賴於抽象而不依賴於具體。數據庫
這個原則的意思是:使用多個隔離的接口,比使用單個接口要好。它還有另一個意思是:下降類之間的耦合度。因而可知,其實設計模式就是從大型軟件架構出發、便於升級和維護的軟件設計思想,它強調下降依賴,下降耦合。編程
最少知道原則是指:一個實體應當儘可能少地與其餘實體之間發生相互做用,使得系統功能模塊相對獨立。設計模式
合成複用原則是指:儘可能使用合成/聚合的方式,而不是使用繼承。緩存
這些設計模式提供了一種在建立對象的同時隱藏建立邏輯的方式,而不是使用 new 運算符直接實例化對象。這使得程序在判斷針對某個給定實例須要建立哪些對象時更加靈活。多線程
工廠模式(Factory Pattern)是 Java 中最經常使用的設計模式之一。這種類型的設計模式屬於建立型模式,它提供了一種建立對象的最佳方式。架構
在工廠模式中,咱們在建立對象時不會對客戶端暴露建立邏輯,而且是經過使用一個共同的接口來指向新建立的對象。併發
public interface Shape {} public class Circle implements Shape {} public class Square implements Shape {} public class ShapeFactory { public Shape getShape1() { return new Circle(); } public Shape getShape2() { return new Square(); } public Shape getShape(String shape) { switch (shape) { case "circle": return new Circle(); case "square": return new Square(); } return null; } }
工廠方法(Factory Method)模式的意義是定義一個建立產品對象的工廠接口,將實際建立工做推遲到子類當中。核心工廠類再也不負責產品的建立,這樣核心類成爲一個抽象工廠角色,僅負責具體工廠子類必須實現的接口,這樣進一步抽象化的好處是使得工廠方法模式可使系統在不修改具體工廠角色的狀況下引進新的產品。高併發
工廠方法模式是簡單工廠模式的衍生,解決了許多簡單工廠模式的問題。首先徹底實現‘開-閉 原則’,實現了可擴展。其次更復雜的層次結構,能夠應用於產品結果複雜的場合。
public interface Shape {} public class Circle implements Shape {} public class Square implements Shape {} public interface ShapeAbstractFactory { Shape getShape(); } public class CircleFactory implements ShapeAbstractFactory { public Shape getShape() { return new Circle(); } } public class SquareFactory implements ShapeAbstractFactory { public Shape getShape() { return new Square(); } }
抽象工廠模式(Abstract Factory Pattern)隸屬於設計模式中的建立型模式,用於產品族的構建。抽象工廠是全部形態的工廠模式中最爲抽象和最具通常性的一種形態。抽象工廠是指當有多個抽象角色時使用的一種工廠模式。抽象工廠模式能夠向客戶端提供一個接口,使客戶端在沒必要指定產品的具體狀況下,建立多個產品族中的產品對象。
工廠模式中的每個形態都是針對必定問題的解決方案,工廠方法針對的是一類產品;而抽象工廠模式針對的是多類產品,一類產品內又有多種實現類型的狀況。
public interface Shape {} public class Circle implements Shape {} public class Square implements Shape {} public interface color {} public class Red implements Color {} public class Blue implements Color {} public interface AbstractFactory { Shape getShape(); Red getColor(); } public class Factory1 implements AbstractFactory { ... } public class Factory2 implements AbstractFactory { ... }
單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。這種類型的設計模式屬於建立型模式,它提供了一種建立對象的最佳方式。
這種模式涉及到一個單一的類,該類負責建立本身的對象,同時確保只有單個對象被建立。這個類提供了一種訪問其惟一的對象的方式,能夠直接訪問,不須要實例化該類的對象。
注意:單例類只能有一個實例。
public class Singleton { private volatile static Singleton singleton; private Singleton (){} // 不容許經過new來實例化對象 public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
建造者模式(Builder Pattern)使用多個簡單的對象一步一步構建成一個複雜的對象。這種類型的設計模式屬於建立型模式,它提供了一種建立對象的最佳方式。
一個 Builder 類會一步一步構造最終的對象。該 Builder 類是獨立於其餘對象的。
public interface Porudct { } public interface Builder { Product buildPart(Product p); } public interface Director { Product getProduct(); }
原型模式(Prototype Pattern)是用於建立重複的對象,同時又能保證性能。這種類型的設計模式屬於建立型模式,它提供了一種建立對象的最佳方式。
這種模式是實現了一個原型接口,該接口用於建立當前對象的克隆。當直接建立對象的代價比較大時,則採用這種模式。例如,一個對象須要在一個高代價的數據庫操做以後被建立。咱們能夠緩存該對象,在下一個請求時返回它的克隆,在須要的時候更新數據庫,以此來減小數據庫調用。
public interface Cloneable { Object clone(); }
適配器模式(Adapter Pattern)是做爲兩個不兼容的接口之間的橋樑。這種類型的設計模式屬於結構型模式,它結合了兩個獨立接口的功能。這種模式涉及到一個單一的類,該類負責加入獨立的或不兼容的接口功能。
略,簡單來講就是隨意調用,相似於行爲型地中介者模式。
橋接(Bridge)是用於把抽象化與實現化解耦,使得兩者能夠獨立變化。這種類型的設計模式屬於結構型模式,它經過提供抽象化和實現化之間的橋接結構,來實現兩者的解耦。
這種模式涉及到一個做爲橋接的接口,使得實體類的功能獨立於接口實現類。這兩種類型的類可被結構化改變而互不影響。
咱們經過下面的實例來演示橋接模式(Bridge Pattern)的用法。其中,可使用相同的抽象類方法可是不一樣的橋接實現類,來畫出不一樣顏色的圓。
略,簡單來講就是將多種維度的屬性從繼承關係轉化爲組合關係。
過濾器模式(Filter Pattern)或標準模式(Criteria Pattern)是一種設計模式,這種模式容許開發人員使用不一樣的標準來過濾一組對象,經過邏輯運算以解耦的方式把它們鏈接起來。這種類型的設計模式屬於結構型模式,它結合多個標準來得到單一標準。
public interface Filter { List<Object> filter(List<Object> list); }
組合模式(Composite Pattern),又叫部分總體模式,是用於把一組類似的對象看成一個單一的對象。組合模式依據樹形結構來組合對象,用來表示部分以及總體層次。這種類型的設計模式屬於結構型模式,它建立了對象組的樹形結構。
這種模式建立了一個包含本身對象組的類。該類提供了修改相同對象組的方式。
public interface Node { List<Node> getSubNodeList(); }
裝飾器模式(Decorator Pattern)容許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬於結構型模式,它是做爲現有的類的一個包裝。
這種模式建立了一個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。
public interface Shape { } public interface ShapeDecorator { void setShape(Shape shape); void doSomething(); }
外觀模式(Facade Pattern)隱藏系統的複雜性,並向客戶端提供了一個客戶端能夠訪問系統的接口。這種類型的設計模式屬於結構型模式,它向現有的系統添加一個接口,來隱藏系統的複雜性。
這種模式涉及到一個單一的類,該類提供了客戶端請求的簡化方法和對現有系統類方法的委託調用。
public interface Shape { } public interface ShapeMaker { void doSomethingComplex(); }
享元模式(Flyweight Pattern)主要用於減小建立對象的數量,以減小內存佔用和提升性能。這種類型的設計模式屬於結構型模式,它提供了減小對象數量從而改善應用所需的對象結構的方式。
享元模式嘗試重用現有的同類對象,若是未找到匹配的對象,則建立新對象。
略,簡而言之就是單例的複雜狀況。
在代理模式(Proxy Pattern)中,一個類表明另外一個類的功能。這種類型的設計模式屬於結構型模式。
略,簡單來講就是替換類型並作一些外在包裝。
顧名思義,責任鏈模式(Chain of Responsibility Pattern)爲請求建立了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發送者和接收者進行解耦。這種類型的設計模式屬於行爲型模式。
在這種模式中,一般每一個接收者都包含對另外一個接收者的引用。若是一個對象不能處理該請求,那麼它會把相同的請求傳給下一個接收者,依此類推。
public interface Chain { Chain nextChain(); void doSomething(); }
命令模式(Command Pattern)是一種數據驅動的設計模式,它屬於行爲型模式。請求以命令的形式包裹在對象中,並傳給調用對象。調用對象尋找能夠處理該命令的合適的對象,並把該命令傳給相應的對象,該對象執行命令。
public interface Receiver { void doAction(); } public interface Command { void execute(); } public interface Invoker { void execute(); }
解釋器模式(Interpreter Pattern)提供了評估語言的語法或表達式的方式,它屬於行爲型模式。這種模式實現了一個表達式接口,該接口解釋一個特定的上下文。這種模式被用在 SQL 解析、符號處理引擎等。
public interface Expression { boolean interpret(String context); } public class TerminalExpression implements Expression { …… } public class AndExpression implements Expression { …… }
迭代器模式(Iterator Pattern)是 Java 和 .Net 編程環境中很是經常使用的設計模式。這種模式用於順序訪問集合對象的元素,不須要知道集合對象的底層表示。
public interface Iterator { Obejct first(); boolean hasNext(); Object next(); } public interface Aggregate { Iterator createIterator(); }
中介者模式(Mediator Pattern)是用來下降多個對象和類之間的通訊複雜性。這種模式提供了一箇中介類,該類一般處理不一樣類之間的通訊,並支持鬆耦合,使代碼易於維護。中介者模式屬於行爲型模式。
public interface Mediator { void doAllThings(); }
備忘錄模式(Memento Pattern)保存一個對象的某個狀態,以便在適當的時候恢復對象。備忘錄模式屬於行爲型模式。
public interface Memento { void setState(int state); int getState(); } public interface Originator { void restore(Memento memento); Memento createMemento(); } public interface Caretaker { Memento getMemento(int i); void addMemento(Memento memento); }
當對象間存在一對多關係時,則使用觀察者模式(Observer Pattern)。好比,當一個對象被修改時,則會自動通知它的依賴對象。觀察者模式屬於行爲型模式。
public interface Observer { void update(); } public interface Subject { void attach(Observer o) void detach(Observer o); void notify(); }
在狀態模式(State Pattern)中,類的行爲是基於它的狀態改變的。這種類型的設計模式屬於行爲型模式。在狀態模式中,咱們建立表示各類狀態的對象和一個行爲隨着狀態對象改變而改變的 context 對象。
public interface State { void handle(); } public interface Context { void setState(State s); State getState(); }
有兩種含義:
在空對象模式中,咱們建立一個指定各類要執行的操做的抽象類和擴展該類的實體類,還建立一個未對該類作任何實現的空對象類,該空對象類將無縫地使用在須要檢查空值的地方。
// 含義1:取代null的檢查 public interface Nullable { boolean isNull(); } // 含義2:不作任何動做的關係 public interface Command { void handle(); } public class NullCommand implements Command { public void handle() { return; } }
在策略模式(Strategy Pattern)中,一個類的行爲或其算法能夠在運行時更改。這種類型的設計模式屬於行爲型模式。
在策略模式中,咱們建立表示各類策略的對象和一個行爲隨着策略對象改變而改變的 context 對象。策略對象改變 context 對象的執行算法。
public interface Strategy { void strategy(); }
在模板模式(Template Pattern)中,一個抽象類公開定義了執行它的方法的方式/模板。它的子類能夠按須要重寫方法實現,但調用將以抽象類中定義的方式進行。這種類型的設計模式屬於行爲型模式。
略,其實繼承狀況下,就是對某些方法提供默認實現,對某些方法容許重寫覆蓋。
在訪問者模式(Visitor Pattern)中,咱們使用了一個訪問者類,它改變了元素類的執行算法。經過這種方式,元素的執行算法能夠隨着訪問者改變而改變。這種類型的設計模式屬於行爲型模式。根據模式,元素對象已接受訪問者對象,這樣訪問者對象就能夠處理元素對象上的操做。
public interface Visitor { void visit(Element e); } public interface Element { void accept(Visitor v); } // 一般在accept中,調用v.visit(this)來進行訪問操做。