這篇總結主要是基於我先前設計模式基礎系列文章而形成的。主要是把重要的知識點用自己的話說了一遍,可能會有一些錯誤,還望見諒和指點。
設計模式
#建立型模式
建立型模式的作用就是建立對象,說到建立一個對象,最熟悉的就是new 一個對象,然後set 相關屬性。但是,在很多場景下,我們需要給客戶端提供更友善的創建物件的方式,尤其是那種我們定義了類,但是需要提供給其他開發者用的時候。
單一範例
单例模式保证全局的单例类只有一个实例,这样的话使用的时候直接获取即可,比如数据库的一个连接,Spring里的bean,都可以是单例的。 单例模式一般有5种写法。 第一种是饿汉模式,先把单例进行实例化,获取的时候通过静态方法直接获取即可。缺点是类加载后就完成了类的实例化,浪费部分空间。 第二种是饱汉模式,先把单例置为null,然后通过静态方法获取单例时再进行实例化,但是可能有多线程同时进行实例化,会出现并发问题。 第三种是逐步改进的方法,一开始可以用synchronized关键字进行同步,但是开销太大,而后改成使用volatile修饰单例,然后通过一次检查判断单例是否已初始化,如果未初始化就使用synchronized代码块,再次检查单例防止在这期间被初始化,而后才真正进行初始化。 第四种是使用静态内部类来实现,静态内部类只在被使用的时候才进行初始化,所以在内部类中进行单例的实例化,只有用到的时候才会运行实例化代码。然后外部类再通过静态方法返回静态内部类的单例即可。 第五种是枚举类,枚举类的底层实现其实也是内部类。枚举类确保每个类对象在全局是唯一的。所以保证它是单例,这个方法是最简单的。
工廠模式
简单工厂一般是用一个工厂创建多个类的实例。 工厂模式一般是指一个工厂服务一个接口,为这个接口的实现类进行实例化 抽象工厂模式是指一个工厂服务于一个产品族,一个产品族可能包含多个接口,接口又会包含多个实现类,通过一个工厂就可以把这些绑定在一起,非常方便。
原型模式
一般通过一个实例进行克隆从而获得更多同一原型的实例。使用实例的clone方法即可完成。
建造者模式
建造者模式中有一个概念叫做链式调用,链式调用为一个类的实例化提供便利,一般提供系列的方法进行实例化,实际上就是将set方法改造一下,将原本返回为空的set方法改为返回this实例,从而实现链式调用。 建造者模式在此基础上加入了builder方法,提供给外部进行调用,同样使用链式调用来完成参数注入。
結構型模式
#前面建立型模式介紹了建立物件的一些設計模式,這節介紹的結構型模式旨在透過改變程式碼結構來達到解耦的目的,使得我們的程式碼容易維護和擴展。
適配器模式
適配器模式用於將兩個不同的類別進行適應。
適配器模式和代理模式的異同
比較這兩種模式,其實是比較物件適配器模式和代理模式,在程式碼結構上,
它們很相似,都需要一個具體的實作類別的實例。
但是它們的目的不一樣,代理模式做的是增強原方法的活;
適配器做的是適配的活,為的是提供“把雞包裝成鴨,然後當做鴨來使用”,
而雞和鴨它們之間原本沒有繼承關係。
適配器模式可以分為類別適配器,物件適配器等。
類別適配器透過繼承父類別就可以把自己適配成父類別了。
而物件適配器則需要把物件傳入另一個物件的建構方法中,以便進行包裝。
享元模式
/ 享元模式的核心在於享元工廠類,
// 享元工廠類的作用在於提供一個用於儲存享元物件的享元池,
// 使用者需要物件時,首先從享元池中獲取,
// 如果享元池中不存在,則建立一個新的享元物件傳回給用戶,
// 在享元池中儲存該新增物件。
//享元模式
// 英文是Flyweight Pattern,不知道是誰最先翻譯的這個詞,感覺這翻譯真的不好理解,我們試著強行關聯起來吧。 Flyweight 是輕量級的意思,享元分開來說就是 共享 元件,也就是復用已經產生的對象,這種做法當然也就是輕量級的了。
// 複用物件最簡單的方式是,用一個 HashMap 來存放每次新產生的物件。每次需要一個物件的時候,先到 HashMap 看看有沒有,如果沒有,再產生新的對象,然後將這個物件放入 HashMap 中。
// 這種簡單的程式碼我就不示範了。
代理模式
// 我們發現沒有,代理模式說白了就是做 「方法包裝」 或做 「方法增強」。
// 在面向切面程式設計中,算了還是不要吹捧這個名詞了,在 AOP 中,
// 其實就是動態代理的過程。例如Spring 中,
// 我們自己不定義代理類,但是Spring 會幫我們動態來定義代理,
// 然後把我們定義在@Before、@After、@Around中的程式碼邏輯動態加入到代理程式中。
外觀模式
外觀模式一般封裝具體的實作細節,為使用者提供一個更簡單的介面。
透過一個方法呼叫就可以取得需要的內容。
組合模式
//組合模式用於表示具有層次結構的數據,使得我們對單一物件和組合物件的存取具有一致性。
//直接看一個例子吧,每個員工都有姓名、部門、薪水這些屬性,
// 同時還有下屬員工集合(雖然可能集合為空),
// 而下屬員工和自己的結構是一樣的,
// 也有姓名、部門這些屬性,
// 同時也有他們的下屬員工集合。
class Employee { private String name; private String dept; private int salary; private List<Employee> subordinates; // 下属 }
裝飾者模式
裝飾者
裝飾者模式把每個增強類別都繼承最高級父類。然後需要功能增強時把類別實例傳入增強類別即可,然後增強類別在使用時就可以增強原有類別的功能了。
和代理模式不同的是,裝飾者模式每個裝飾類別都繼承父類,並且可以進行多層封裝。
行為型模式
行為型模式關注的是各個類別之間的相互作用,將職責劃分清楚,使得我們的程式碼更加清晰。
策略模式
策略模式一般把一個策略當作一個類,並且在需要指定策略的時候傳入實例,於是我們可以在需要使用演算法的地方傳入指定演算法。
指令模式
#命令模式一般分為命令發起者,命令以及命令接受者三個角色。
命令發起者在使用時需要注入命令實例。然後執行命令調用。
命令呼叫實際上會呼叫命令接收者的方法進行實際呼叫。
例如遙控器按鈕相當於一條命令,點擊按鈕時命令運行,自動呼叫電視機提供的方法即可。
模板方法模式
模板方法一般指提供了一個方法模板,並且其中有部分實現類別和部分抽象類,並且規定了執行順序。
實作類別是模板提供好的方法。而抽象類別則需要使用者自行實作。
模板方法規定了一個模板中方法的執行順序,非常適合一些開發框架,因此模板方法也廣泛運用在開源框架中。
觀察者模式和事件監聽機制
觀察者模式一般用於訂閱者和訊息發布者之間的資料訂閱。
一般分為觀察者和主題,觀察者訂閱主題,把實例註冊到主題維護的觀察者清單上。
而主題更新資料時自動把資料推給觀察者或通知觀察者資料已經更新。
但是由於這樣的方式訊息推送耦合關係比較緊。並且很難在不開啟資料的情況下知道資料類型是什麼。
知道後來為了使數據格式更加靈活,使用了事件和事件監聽器的模式,事件包裝的事件類型和事件數據,從主題和觀察者中解耦。
主題當事件發生時,觸發該事件的所有監聽器,把該事件通過監聽器列表發給每個監聽器,監聽得到事件以後,首先根據自己支持處理的事件類型中找到對應的事件處理器,再用處理器處理對應事件。
責任鏈模式
責任鏈通常需要先建立單向鍊錶,然後呼叫方只需要呼叫頭部節點就可以了,後面會自動流轉下去。例如流程審核就是一個很好的例子,只要終端使用者提交申請,根據申請的內容訊息,自動建立一條責任鏈,然後就可以開始流轉了
以上是Java設計模式簡介的詳細內容。更多資訊請關注PHP中文網其他相關文章!