Java Design Pattern(Factory,Singleton,Prototype,Proxy)

1、Factory 設計模式: the most common pattern,create a new object ,eg. A a=new A();工廠模式的好處:工廠模式能夠作到把建立對象單獨提出來,起到解耦做用,即:若是要修改建立對象的邏輯不用在項目裏的各處修改了,只須要在工廠裏面修改一處就能夠了,大大縮短了修改的工做量.java

此模式屬於建立型設計模式,它只定義建立對象的接口,而由它的子類負責建立具體的對象,利用子類實例化不一樣的對象。圖一是Factory Method 模式結構的類圖(Class Diagram),其中:數據庫

  1. Product 定義了由factory method所建立對象的統一接口。
  2. ConcreteProduct 具體的類,實現Product接口。
  3. Creator 通常爲抽象類,聲明若干factory method(方法),由它建立類型爲Product的對象。正由於它能"生產"對象,因此稱爲factory method。Creator也可能擁有一個方法建立某個缺省的具體對象。
  4. ConcreteCreator 重載factory method以建立某個 ConcreteProduct 的具體實例。

也就是說Creator依賴於ConcreteCreator建立Product型的ConcreteProduct對象。 Factory method使應用程序代碼只需處理Product接口,而與具體的類(ConcreteProduct)無關,加強了代碼可重用性,由於它獨立於用戶定義的具體的類。設計模式

小結 工廠模式的適用範圍 
• 在編碼時不能預見須要建立哪種類的實例。 
• 一個類使用它的子類來建立對象。 
• 開發人員不但願建立了哪一個類的實例以及如何建立實例的信息暴露給外部程序。安全

2、Singleton 單例模式: let one class only has one instance, something like static parameter, can save memory,
           beneficial to garbage collection            Singleton 是一種建立性模型,它用來確保只產生一個實例,並提供一個訪問它的全局訪問點.對一些類來講,保證只有一個實例是很重要的,好比有的時候,數據庫鏈接或 Socket 鏈接要受到必定的限制,必須保持同一時間只能有一個鏈接的存在.再舉個例子,集合中的 set 中不能包含重複的元素,添加到set裏的對象必須是惟一的,若是重複的值添加到 set,它只接受一個實例.JDK中正式運用了Singleton模式來實現 set 的這一特性,你們能夠查看java.util.Collections裏的內部靜態類SingletonSet的原代碼.其實Singleton是最簡單但也是應用最普遍的模式之一,在 JDK 中隨處可見.多線程

爲了實現 Singleton 模式,咱們須要的是一個靜態的變量,可以在不建立對象的狀況下記憶是否已經產生過實例了.靜態變量或靜態方法均可以在不產生具體實例的狀況下直接調用,這樣的變量或方法不會由於類的實例化而有所改變.在圖1的結構中能夠看到,uniqueInstance 就是這個獨立的靜態變量,它能夠記憶對象是否已經實例化了,在靜態方法 Instance 中對這個變量進行判斷,若沒有實例化過就產生一個新的對象,若是已經實例化了則再也不產生新的對象,仍然返回之前產生的實例.編碼

小結spa

  1. Singleton模式能夠方便的進行擴充,產生指定數目的實例.
  2. 在The Design Patterns Java Companion 一書中曾提到過用靜態類的方式來實現 Singleton模式,並指出java.lang.Math就是一個例子,這裏我並不表示贊同,由於Math並非一個真正的對象,咱們只是直接調用Math類所包裝的靜態方法而已,根本就沒有建立實例的過程,又從何提及只產生一個實例呢?這個問題我曾到Javaranch的論壇上發過帖子,全部回帖的人也都是對這一觀點持否認態度.
  3. 在多線程的程序中,singleton可能會變的不可靠,可能會出現多個實例,解決的辦法很簡單,加個同步修飾符: public static synchronized Singleton getInstance(). 這樣就保證了線程的安全性.
  4. 最後要說的是你們可能會看見一些其餘實現Singleton模式的方法,由於模式在具體的應用時是靈活的,不是一成不變的,並無一個固定的作法,但大都是上面幾種方法的變形.

3、Prototype 原型模式:the same as clone()線程

一、定義:原型模式就是經過一個原型對象來代表要建立的對象類型,而後用複製這個對象的方法來建立更痛類型的對象。設計

二、原理:有兩部分組成,抽象原型和具體原型。代理

三、使用時機:系統須要 建立吃的對象是動態加載的,並且產品具備必定層次時,能夠考慮使用原型模式。

>當要實例化的類是在運行時刻指定時,例如,經過動態裝載;

>或者爲了不建立一個與產品類層次平行的工廠類層次時;

>或者當一個類的實例只能有幾個不一樣狀態組合中的一種時。

>創建相應數目的原型並克隆它們可能比每次用合適的狀態手工實例化該類更方便一些。

四、效果:

>能夠再運行時刻增長和刪除產品。

>能夠經過改變值來指定產品。

>能夠經過改變結構來指定新對象。

>減小子類的構造

>能夠用類動態配置應用。

五、實現:

>使用一個原型管理器

>實現克隆操做(淺拷貝和深拷貝)

>初始化克隆對象。

六、使用原型模式的意圖:用原型實例指定建立對象的種類,而且經過拷貝這些原型建立新的對象。

七、解決的問題:

好比有一個對象,在某一時刻該對象中已經包含了一些有效的值,此時可能會須要一個和該對象徹底相同的新對象,而且此後對新對象的任何改動都不會影響到原來對象中的值,也就是說新對象與原來的對象是兩個獨立的對象,但新對象的初始值是由原來的對象肯定的。

Clone:

賦值建立對象:

>java中賦值建立對象是能夠實現對象的重用的,可是新對象和原對象是同一個引用;若是修改其中的一個對象的值,則另外的一個對象也會發生改變。

>使用clone方法會返回對象的一個拷貝,這樣一來,若是修改一個對象的值,則另外的對象不會發生改變的。

4、Proxy 代理模式:一個類表明另外一個類的功能。這種類型的設計模式屬於結構型模式。

在代理模式中,咱們建立具備現有對象的對象,以便向外界提供功能接口。

代理模式涉及的角色: 
1:抽象主題角色.聲明瞭代理主題和真實主題的公共接口,使任何須要真實主題的地方都能用代理主題代替. 

2:代理主題角色.含有真實主題的引用,從而能夠在任什麼時候候操做真實主題,代理主題功過提供和真實主題相同的接口,使它能夠隨時代替真實主題.代理主題經過持有真實主題的引用,不但能夠控制真實主題的建立或刪除,能夠在真實主題被調用前進行攔截,或在調用後進行某些操做. 

3:真實代理對象.定義了代理角色所表明的具體對象.  

攔截機制是代理模式的重要使用方式之一, 
除了攔截,代理模式還經常使用於資源加載,當咱們要加載的資源很大時,咱們可讓真實主題角色在後臺加載資源,讓代理主題角色負責處理前臺的等待提示信息. 

還有就是受權機制,經過代理能攔截真實主題的能力,來控制真實主題的訪問權限. 

相關文章
相關標籤/搜索