1. 程式人生 > 實用技巧 >Codeforces Round #683 (Div. 2, by Meet IT) C

Codeforces Round #683 (Div. 2, by Meet IT) C

轉自:《Java 設計模式》2009年( 耿祥義 張躍平 著)

一,概括

單例模式:

    保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。

二,引入

在某些情況下,我們可能需要某個類只能創建出一個物件,即不讓使用者用該類例項化出多於兩個的例項。比如,蘇軾說的 “但願人長久,千里共嬋娟”,或是張若虛說的 “海上升明月,天涯共此時”。無論我們身處何方,我們所能夠看到的月亮都是同一輪的啊。在根據這兩句詩建立的系統中,有人這個類,他們有名字和位置的屬性,他們也可以實現賞月的動作,但是他們賞的是同一個月,那麼設計者就需要保證只有一個月亮的例項,不能允許使用者使用月亮的構造方法再創建出第2個例項。

三,程式碼與類圖

上面引入的程式碼:

class Moon
{
	private static Moon m;
	private double radius;
	// 構造方法
	private Moon()
	{
		m = this;
		radius = 1738;
	}
	// 存取方法
	public static synchronized Moon getMoon()
	{
		if(m == null)
			m = new Moon();
		return m;
	}
	// 功能方法
	public String showMoon()
	{
		String s = "這是獨一無二的月亮,它的半徑是" + radius + " km.";
		return s;
	}
}
class Someone
{
	private String name;
	private String where;
	// 構造方法
	public Someone(String name,String where)
	{
		this.name = name;
		this.where = where;
	}
	// 功能方法
	public void seeMoon()
	{
		Moon m = Moon.getMoon();
		System.out.printf("有個叫" + this.name + "的人正在" + where + "賞月。" + m.showMoon() + "\n");
	}
}
public class M
{
	public static void main(String args[])
	{
		Someone SuShi = new Someone("蘇軾","酒桌前");
		Someone ZhangJiuling = new Someone("張九齡","空房中");
		SuShi.seeMoon();
		ZhangJiuling.seeMoon();
	}
}

上面引入的類圖:

(注: 由於找不到合適的箭頭,這箭頭就畫的不標準了)

四,單例模式的結構

單例模式的結構十分簡單,只包括一個角色:單例類(Singleton),單例類只可以創建出一個例項。

單例類在設計上的特點:

①:單例類中包含用自身宣告的類屬性,這個類屬性是單例類唯一的例項。

②: 為了確保用自身宣告的類屬性只有一個例項,單例類將自身的構造方法的訪問許可權設定為 private .這樣一來,任何其他類都無法使用單例類來建立物件。

③:為了讓使用者使用單例類的唯一例項,單例類必須提供訪問該例項的方法,使得使用者可以使用單例類的類名呼叫這個類方法訪問這個唯一的例項。

五,單例模式的優缺點

優點:單例類的唯一例項由類本身控制,所以可以很好地控制使用者何時訪問它。

六,單例模式的使用場景

當系統需要某個類只能有一個例項。

=========== ========== ======= ====== ====== ===== ==== === == =

青玉案·元夕  宋代:辛棄疾

東風夜放花千樹,更吹落,星如雨。寶馬雕車香滿路。鳳簫聲動,玉壺光轉,一夜魚龍舞。
蛾兒雪柳黃金縷,笑語盈盈暗香去。眾裡尋他千百度,驀然回首,那人卻在,燈火闌珊處。