模式

單例模式 

概念:
顧名思義,就是隻有一個實例。   
作爲對象的創建模式[GOF95], 單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。這個類稱爲單例類。
要點:
   一是某個類只能有一個實例;二是它必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。
在下面的對象圖中,有一個"單例對象",而"客戶甲"、"客戶乙" 和"客戶丙"是單例對象的三個客戶對象。
可以看到,所有的客戶對象共享一個單例對象。而且從單例對象到自身的連接線可以看出,單例對象持有對自己的引用。
案例:
先看兩段代碼(注意描述部分與註釋);
1,餓漢式單例類

/** 
* @author wonter 
* 描述:餓漢式是線程安全的,在類創建的同時就已經創建好一個靜態的對象供系統使用,以後不在改變 
* 郵件: [email protected] 
*/ 
public class Singleton {
//注意這是private 只供內部調用
private static Singleton instance = new Singleton();
private Singleton(){
//空構造 防止被其他類new
}
//外部訪問本class的靜態方法,可以直接訪問 
public static Singleton getInstance() {
return instance; 
} 
} 



2,懶漢式單例類
/** 
* @author wonter 
* 比較: 這個方法比上面有所改進,不用每次都進行生成對象,只是第一次。使用時生成實例,提高了效率! 
* 描述:懶漢式如果在創建實例對象時不加上synchronized則會導致對對象的訪問不是線程安全的 
* 郵件: [email protected] 
*/ 
public class Singleton { 
private static Singleton instance = null;
//抽象集團類,線程互斥,排隊模式
public static synchronized Singleton getInstance() { 
if (instance==null)// 線程1
instance=new Singleton();
//線程1後,才允許線程2運行
return instance; 
} 
} 

好處:
單例模式屬於構建模式之一,實例控制--伸縮性
缺點:
系統開銷---開發混淆---對象生命週期


代理模式:

概念:
代理模式,也有人稱爲委託代理模式。代理模式是軟件設計模式中的一項基本技巧。
在代理模式中,有兩個對象參與處理同一個請求,接受請求的對象將請求委託給另一個對象來處理。
代理模式是一項基本技巧,許多其他的模式,如狀態模式、策略模式、訪問者模式本質上是在更特殊的場合採用了代理模式。
委託模式使得我們可以用聚合來替代繼承,它還使我們可以模擬mixin。
角色:
抽象角色:聲明真實對象和代理對象的共同接口;
代理角色:代理對象角色內部含有對真實對象的引用,從而可以操作真實對象,同時代理對象提供與真實對象相同的接口以便在任何時刻都能代替真實對象。
同時,代理對象可以在執行真實對象操作時,附加其他的操作,相當於對真實對象進行封裝。

步驟:
(①②步比較菜,忽略。有異議者聯繫!)
①首先還是接口。將要代理的所有東西(這裏舉的例子是鞋子)的接口。
②定義某某公司,繼承接口。
③定義代理人,繼承接口。
/** 
* @author wonter 
* 描述:就比如我要做這個代理商,我就要繼承賣鞋子這個接口(XieZ)。
* 郵件: [email protected] 
*/ 
public class Wonter implements XieZ { 
private XieZ xiezi; 
//你可以默認做阿迪達斯的代理
public wonter(){ 
this.xiezi = new adidas(); 
} 
//也可以是XieZ中的任何一家公司的代理,只要你是這一類型 
//這裏類型是XieZ接口,但傳入的則是“實現”接口的公司。
public Wonter(XieZ gongsi){ 
this.xiezi = gongsi; 
} 
public void bsktb() { 
this.xiezi.bsktb(); //我只是代理,替公司賣鞋子
} 
public void ftb() { 
this.xiezi.ftb(); //我只是代理,替公司賣鞋子
} 
} 

④最後到了定義買家的時候了。
/** 
* @author wonter 
* 描述:定義買家 
* 郵件: [email protected] 
*/ 
public class MaiJia { 
public static void main(String[] args) { 
//找到我代理的店鋪
Wonter wonter = new Wonter(); 
//在我這選擇你喜歡的鞋子。
//注意的是,雖然表面上是我在鞋子,但實際上卻是某某公司在賣鞋子。
wonter.bsktb(); 
wonter.ftb(); } 
} 
}

例如:此時又有一家公司(nike)找我做代理。相同的是:nike公司也是繼承了XieZ這個接口。
它也擁有XieZ接口中的所有功能。(或者還有XieZ接口中沒有的功能,nike公司獨有的功能)
這下我該怎麼辦呢?

/
** 
* @author wonter 
* 描述:此時又有一家公司(nike)找我做代理。 
* 郵件: [email protected] 
*/ 
public class MaiJia { 
public static void main(String[] args) { 
//做代理,也要先找到合適的公司吧。首先選定公司。
Nike nike = new Nike(); 
//詳見wonter.java中
//wonter繼承XieZ接口,傳入nike公司,改寫wonter方法。
//這樣,我就nike公司的所有鞋子,成了nike公司的代理人了。
Wonter wonter = new Wonter(nike); 
//在我這選擇你喜歡的鞋子。
wonter.bsktb(); 
wonter.ftb(); 
} 
} 

好處:
代理模式的作用是:爲其他對象提供一種代理以控制對這個對象的訪問。
在某些情況下,一個客戶不想或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
 

工廠模式

發佈了21 篇原創文章 · 獲贊 8 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章