單例模式
summary
1劣纲、只有一個實(shí)例
2、整個系統(tǒng)共用這個實(shí)例
餓漢模式
public class Singleton{
private static final Singleton singleton =new Singleton();
//限制產(chǎn)生多個對象
private Singleton(){
}
//獲得實(shí)例的方法
public static Singleton getInstance(){
return singleton;
}
//類中的其他方法谁鳍,盡量 static
public static void doSomething(){
}
}
懶漢模式
用的時候癞季,創(chuàng)建實(shí)例劫瞳。高并發(fā)的時候,需要在方法前添加synchronize绷柒;
public class Singleton{
private static final Singleton singleton =null;
//限制產(chǎn)生多個對象
private Singleton(){
}
//獲得實(shí)例的方法
public static Singleton getInstance(){
if(singleton==null){
singleton =new Singleton();
}
return singleton;
}
//類中的其他方法志于,盡量 static
public static void doSomething(){
}
}
優(yōu)點(diǎn)
1、唯一實(shí)例废睦,避免多次創(chuàng)建伺绽,減小內(nèi)存使用。
2嗜湃、全局共享唯一資源奈应,調(diào)度,管理方便购披。
3杖挣、加鎖后,防止資源文件的同時讀寫刚陡。
缺點(diǎn)
1惩妇、擴(kuò)展困難,需要擴(kuò)展么筐乳?屿附?
2、違背單一職責(zé)原則哥童,單例的實(shí)例一般是一個混合型的靜態(tài)類。
3褒翰、“單例模式對測試是不利的贮懈。在并行開發(fā)環(huán)境中,如果單例模式?jīng)]有完成优训,是不能進(jìn)行測試的朵你,沒有接口也不能使用mock的方式虛擬一個對象〈Х牵”
摘錄來自: 秦小波. “設(shè)計(jì)模式之禪(第2版)”抡医。
擴(kuò)展:多例模式
利用一個list進(jìn)行實(shí)例管理,考慮到同步問題早敬,可以采用vector忌傻;
public class Singleton{
private static int maxNumber =2;
private static List<Singleton> singletonList =new ArrayList<>();
private static final Singleton singleton =null;
static{
for(int i =0;i<maxNumber;i++){
singletonList.add(new Singleton() );
}
}
//限制產(chǎn)生多個對象
private Singleton(){
}
//獲得實(shí)例的方法
public static Singleton getInstance(){
Random random = new Random();
return singletonList.get(random.nextInt(maxNumber));
}
//類中的其他方法,盡量 static
public static void doSomething(){
}
}
2.工廠方法模式
- 定義一個用于創(chuàng)建對象的接口搞监,具體實(shí)現(xiàn)類由他的子類決定水孩。工廠方法使一個類的實(shí)例化延遲到其子類。
優(yōu)點(diǎn)
- 良好的封裝性琐驴,代碼結(jié)構(gòu)清晰俘种。
- 擴(kuò)展性非常優(yōu)秀秤标,適配新情況,原來的工廠類基本不用修改宙刘。
- 屏蔽產(chǎn)品類苍姜。實(shí)例是在工廠類中實(shí)現(xiàn)的,由工廠類負(fù)責(zé)悬包。
-
工廠模式是典型的解耦合框架衙猪。
擴(kuò)展
2.1簡單工程模式(靜態(tài)工廠模式)
- 去掉工廠模式里的抽象類,將方法改成靜態(tài)方法玉罐。調(diào)用的話變得簡單方便屈嗤。
- 缺點(diǎn)擴(kuò)展比較困難?吊输?饶号,不符合開閉原則?季蚂?
2.2多個工程模式
- 由原來一個工廠變成多個工廠茫船,同時,每個工廠實(shí)現(xiàn)的方法可以進(jìn)行具體化扭屁。
- 當(dāng)工廠種類比較多的時候算谈,代碼比較龐大。
2.3工廠模式實(shí)現(xiàn)單例式(針對惡漢模式)
- 不通過正常手段實(shí)現(xiàn)實(shí)例料滥,通過添加一個static代碼塊然眼。并采用反射的方法來創(chuàng)建實(shí)例。(跟工廠有毛線關(guān)系葵腹?高每?)
//靜態(tài)代碼塊
private static Singleton singleton;
static{
try{
Class cl =Class.forName(Singleton.class.getName());
//獲得無參構(gòu)造
Constructor constructor =cl.getDeclaredConstructor();
//設(shè)置無參構(gòu)造是可以訪問的
constructor.setAccessible(true);
//產(chǎn)生一個實(shí)例對象
singleton =(Singleton)constructor.newInstance();
}catch(Exception e){
}
}
2.4延遲加載工廠類
- 簡單來說,就是創(chuàng)建好實(shí)例后践宴,不馬上釋放掉鲸匿。而是保存在內(nèi)存之中,留做以后使用阻肩。
- 單多個對象需要采用單例模式是带欢,可以把創(chuàng)建一個工程,用一個map容器去保存它們烤惊。
3.抽象工廠模式
- 定義:為創(chuàng)建一組相關(guān)或相互依賴的對象提供的一個接口乔煞,而且無需指定他們的具體類
-
個人理解:需要生產(chǎn)出來的東西具有屬性交叉的特性。即A柒室、B產(chǎn)品具有相同的共性瘤缩,也有不同的特性。為了實(shí)現(xiàn)生產(chǎn)伦泥,根據(jù)其特性實(shí)現(xiàn)工程剥啤,然后創(chuàng)建出具有共性又有特性的產(chǎn)品锦溪。
- 優(yōu)點(diǎn):封裝性、產(chǎn)品族內(nèi)的約束為非公開狀態(tài)府怯。
- 缺點(diǎn):擴(kuò)展困難幸海。
- 場景:當(dāng)一個對象族都有相同約束時候药磺,可以采用這種模式躁锡。例如同一個產(chǎn)品抒抬,想要運(yùn)行在ios,和android冲簿。那么他就需要有兩個開發(fā)團(tuán)隊(duì)(工廠)去創(chuàng)建該項(xiàng)目粟判。
- 代碼地址:
工廠模式和抽象工廠模式的區(qū)別
- 工廠模式:一個抽象的產(chǎn)品,通過工廠創(chuàng)建出不同的具體產(chǎn)品峦剔。并且档礁,產(chǎn)品的創(chuàng)建過程是在工廠之中的。
- 抽象工程模式:跟該模式有個相關(guān)的概念是產(chǎn)品族吝沫,抽象模式中有多個產(chǎn)品族工廠呻澜,每個產(chǎn)品族工廠生產(chǎn)出來的產(chǎn)品跟其他產(chǎn)品族具有相同的產(chǎn)品特性,也有自身產(chǎn)品族的特性惨险。因此羹幸,抽象工廠模式添加產(chǎn)品族簡單,但是增加產(chǎn)品結(jié)構(gòu)缺很蛋疼辫愉。因?yàn)樾枰獙χ暗拿總€產(chǎn)品族重新修改栅受,連同產(chǎn)品類的結(jié)構(gòu)也要發(fā)生改變。
- 產(chǎn)品族和產(chǎn)品等級結(jié)構(gòu):
假設(shè)羅技公司有低中高三種工廠恭朗,他們同時都生產(chǎn)鼠標(biāo)窘疮、鍵盤、攝像頭冀墨。
那么這時候低級工廠、中級工廠等就分別是產(chǎn)品族鼠標(biāo)涛贯、鍵盤诽嘉、攝像頭就分別是產(chǎn)品等級結(jié)構(gòu)
——引自知乎
4.模板方法模式
定義:定義一個操作中的算法框架,將一些步驟(特性)延遲到子類中弟翘。使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟虫腋。
自我理解:之前在寫女媧造人的例子中,也用到了模板模式稀余。首先悦冀,共性的東西(由抽象類實(shí)現(xiàn))例如人都可以說話、吃飯睛琳、走路盒蟆。特性(由具體類實(shí)現(xiàn))人分男女踏烙,這個東西需要具體到最終的實(shí)現(xiàn)類中實(shí)現(xiàn)。
注意: 為防止惡意的操作历等,一般模板方法都加上final讨惩,不允許復(fù)寫
優(yōu)點(diǎn):封裝不變部分,擴(kuò)展可變部分寒屯;提取公共部分代碼荐捻,便于維護(hù);行為由父類控制寡夹,子類實(shí)現(xiàn)处面;
缺點(diǎn): 子類執(zhí)行結(jié)果影響父類的結(jié)果。
-
類圖
5.建造者模式
- 將一個復(fù)雜對象的構(gòu)建與它的表示分離菩掏,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示魂角。
-
自我理解(書中的描述跟我的理解有出入),構(gòu)造者模式的特色是能夠讓調(diào)用者根據(jù)自身情況進(jìn)行建造。采用建造模式患蹂,還可以讓建造者一目了然的了解的建造的元素結(jié)構(gòu)或颊。