這個(gè)模式是很有意思孽锥,而且比較簡(jiǎn)單嚼黔,但是我還是要說(shuō)因?yàn)樗褂玫氖侨绱说膹V泛, 如此的有人緣惜辑,單例就是單一唬涧、獨(dú)苗的意思,那什么是獨(dú)一份呢盛撑?你的思維是獨(dú)一份碎节,除此 之外還有什么不能山寨的呢?我們舉個(gè)比較難復(fù)制的對(duì)象:皇帝 中國(guó)的歷史上很少出現(xiàn)兩個(gè)皇帝并存的時(shí)期撵彻,是有钓株,但不多,那我們就認(rèn)為皇帝是個(gè)單 例模式陌僵,在這個(gè)場(chǎng)景中轴合,有皇帝,有大臣碗短,大臣是要上朝參見(jiàn)皇帝的受葛,今參拜的皇帝 應(yīng)該和昨、前的一樣(過(guò)渡期的不考慮偎谁,找茬哦)总滩,大臣磕完頭后,抬頭一看巡雨,嗨闰渔, 還是昨那個(gè)皇帝,單例模式铐望,絕對(duì)的單例模式: 先定一個(gè)皇帝:
/**
* 中國(guó)的歷史上一般都是一個(gè)朝代一個(gè)皇帝冈涧,有兩個(gè)皇帝的話,必然要PK出一個(gè)皇帝出來(lái)
*/
public class Emperor { private static Emperor emperor = null; //定義一個(gè)皇帝放在那里正蛙,然 后給這個(gè)皇帝名字
private Emperor(){ //世俗和道德約束你督弓,目的就是不讓你產(chǎn)生第二個(gè)皇帝
}
public static Emperor getInstance(){ if(emperor == null){ //如果皇帝還沒(méi)有定義,那就定一個(gè)
emperor = new Emperor();
}
return emperor;
}
//皇帝叫什么名字呀
public static void emperorInfo(){ System.out.println("我就是皇帝某某某....");
}
}
然后定義大臣:
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all. * 大臣是要面見(jiàn)皇帝乒验,今見(jiàn)的皇帝和昨的愚隧,前不一樣那就出問(wèn)題了!
*/
@SuppressWarnings("all")
public class Minister {
/**
* @param args
*/
public static void main(String[] args) { //第一
Emperor emperor1=Emperor.getInstance(); emperor1.emperorInfo(); //第一見(jiàn)的皇帝叫什么名字呢锻全?
//第二
Emperor emperor2=Emperor.getInstance();
Emperor.emperorInfo();
//第三
Emperor emperor3=Emperor.getInstance();
emperor2.emperorInfo();
//三見(jiàn)的皇帝都是同一個(gè)人狂塘,榮幸吧!
}
}
看到?jīng)]鳄厌,大臣見(jiàn)到的都是同一個(gè)皇帝睹耐,不會(huì)產(chǎn)生錯(cuò)亂情況,反正都是一個(gè)皇帝部翘,是 好是壞就這一個(gè)硝训,只要提到皇帝,大家都知道指的是誰(shuí)新思,清晰窖梁,而又明確。問(wèn)題是這是通常 情況夹囚,還有個(gè)例的纵刘,如同一個(gè)時(shí)期同一個(gè)朝代有兩個(gè)皇帝,怎么辦荸哟?
多例的情況
/**
*
* 中國(guó)的歷史上一般都是一個(gè)朝代一個(gè)皇帝假哎,有兩個(gè)皇帝的話瞬捕,必然要PK出一個(gè)皇帝出來(lái)。
* 問(wèn)題出來(lái)了:如果真在一個(gè)時(shí)間舵抹,中國(guó)出現(xiàn)了兩個(gè)皇帝怎么辦肪虎?比如明朝土木堡之變后,
* 明英宗被俘虜惧蛹,明景帝即位扇救,但是明景帝當(dāng)上皇帝后樂(lè)瘋了,竟然忘記把他老哥明英宗 削為上皇香嗓, * 也就是在這一個(gè)多月的時(shí)間內(nèi)迅腔,中國(guó)竟然有兩個(gè)皇帝!
*
*/
@SuppressWarnings("all")
public class Emperor { private static int maxNumOfEmperor = 2; //最多只能有連個(gè)皇帝
private static ArrayList emperorInfoList=new ArrayList(maxNumOfEmperor); //皇帝叫什么名字
private static ArrayList emperorList=new ArrayList(maxNumOfEmperor); //裝皇帝的列表靠娱; private static int countNumOfEmperor =0; //正在被人尊稱(chēng)的是那個(gè)皇 帝
//先把2個(gè)皇帝產(chǎn)生出來(lái)
static{ //把所有的皇帝都產(chǎn)生出來(lái)
for(int i=0;i<maxNumOfEmperor;i++){ emperorList.add(new Emperor("皇"+(i+1)+"帝"));
}
}
//就這么多皇帝了沧烈,不允許再推舉一個(gè)皇帝(new 一個(gè)皇帝)
private Emperor(){ //世俗和道德約束你,目的就是不讓你產(chǎn)生第二個(gè)皇帝
}
private Emperor(String info){
emperorInfoList.add(info);
}
public static Emperor getInstance(){
Random random = new Random(); countNumOfEmperor = random.nextInt(maxNumOfEmperor); //隨機(jī) 拉出一個(gè)皇帝像云,只要是個(gè)精神領(lǐng)袖就成
return (Emperor)emperorList.get(countNumOfEmperor);
}
//皇帝叫什么名字呀
public static void emperorInfo(){
System.out.println(emperorInfoList.get(countNumOfEmperor));
}
}
那大臣是比較悲慘了掺出,兩個(gè)皇帝呀,兩個(gè)老子呀苫费,怎么拜呀汤锨,不管了,只要是個(gè)皇帝成了:
/**
* 大臣們悲慘了百框,一個(gè)皇帝都伺候不過(guò)來(lái)了闲礼,現(xiàn)在還來(lái)了兩個(gè)個(gè)皇帝 * TND,不管了铐维,找到個(gè)皇帝柬泽,磕頭,請(qǐng)按就成了嫁蛇!
*/
@SuppressWarnings("all")
public class Minister {
/**
* @param args
*/
public static void main(String[] args) {
int ministerNum =10; //10個(gè)大臣
for(int i=0;i<ministerNum;i++){
Emperor emperor = Emperor.getInstance(); System.out.print("第"+(i+1)+"個(gè)大臣參拜的是:");
emperor.emperorInfo();
}
}
}
這里說(shuō)一下锨并,一個(gè)類(lèi)可創(chuàng)建的實(shí)例。它的數(shù)目可以分為四種情況:
0睬棚,1第煮,多,無(wú)窮
我們正常的類(lèi)即public class 一般都是最后一種情況抑党,可以創(chuàng)建無(wú)窮多個(gè)
而像Math這樣的工具類(lèi)(一般它的構(gòu)造方法為私有或者是一個(gè)沒(méi)有實(shí)現(xiàn)類(lèi)的接口)包警,我們只需要它的靜態(tài)方法作為工具方法去使用,故而無(wú)需創(chuàng)建它的實(shí)例底靠,所以是0個(gè)害晦。
1和多 在本文中對(duì)應(yīng)單例模式多例的情況。
在傳統(tǒng)的設(shè)計(jì)模式中暑中,并沒(méi)有多例模式這一說(shuō)壹瘟,我想這大概是因?yàn)樗蛦卫穷?lèi)似的鲫剿,都是創(chuàng)建特定數(shù)目的實(shí)例,只不過(guò)數(shù)據(jù)結(jié)構(gòu)不同罷了稻轨,前者getInstance是得到本類(lèi)的一個(gè)對(duì)象灵莲,而后者則是多個(gè)本類(lèi)實(shí)例對(duì)象組成的集合,實(shí)現(xiàn)手段也是接近的澄者。
但是這種多例的情況在實(shí)際開(kāi)發(fā)中也是會(huì)被用到的,比如對(duì)象池的場(chǎng)合请琳。