国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

設(shè)計(jì)模式之單件模式(Singleton Pattern )

2024-07-21 02:16:29
字體:
供稿:網(wǎng)友

單件模式

singleton pattern



singleton 模式,它包含在創(chuàng)造性模式系列中。

創(chuàng)造性模式指示如何以及何時創(chuàng)建對象。singleton 模式可以保證一個類有且只有一個實(shí)例,并提供一個訪問它的全局訪問點(diǎn)。在程序設(shè)計(jì)過程中,有很多情況需要確保一個類只能有一個實(shí)例。例如,系統(tǒng)中只能有一個窗口管理器、一個打印假脫機(jī),或者一個數(shù)據(jù)引擎的訪問點(diǎn)。pc機(jī)中可能有幾個串口,但只能有一個com1實(shí)例。

其結(jié)構(gòu)如下:




我們可以定義一個spooler類,實(shí)現(xiàn)singleton 模式



public class spooler

private shared spool_counter as integer

private shared glbspooler as spooler

private legalinstance as boolean

'-----

private sub new()

mybase.new()

if spool_counter = 0 then '建立并且保存這個實(shí)例

glbspooler = me '保存實(shí)例

spool_counter = spool_counter + 1 '計(jì)數(shù)

legalinstance = true

else

legalinstance = false

throw new spoolerexception

end if

end sub

'-----

public shared function getspooler() as spooler

try

glbspooler = new spooler()

catch e as exception

throw e '實(shí)例已經(jīng)存在

finally

getspooler = glbspooler '返回唯一的實(shí)例

end try

end function

'-----

public sub print(byval str as string)

if legalinstance then

messagebox.show(str)

else

throw new spoolerexception()

end if

end sub

'-----

end class









spoolerexception類



public class spoolerexception

inherits exception

private mesg as string

'---------

public sub new()

mybase.new()

mesg = "只能創(chuàng)建一個實(shí)例!"

end sub

'---------

public overrides readonly property message() as string

get

message = mesg

end get

end property

end class



使用單件模式



private spl as spooler

private sub errorbox(byval mesg as string)

messagebox.show(mesg, "spooler error", messageboxbuttons.ok)

end sub

private sub btgetspooler_click (byval sender as system.object, byval e as system.eventargs) handles btgetspooler.click

try

spl = spooler.getspooler

textbox1.text = "創(chuàng)建實(shí)例!"

catch ex as exception

errorbox("實(shí)例已經(jīng)創(chuàng)建,并且只能創(chuàng)建一個實(shí)例!")

end try

end sub



private sub print_click (byval sender as system.object, byval e as system.eventargs) handles print.click

try

spl.print("實(shí)例已經(jīng)創(chuàng)建,并且你單擊了按鈕!")

catch ex as exception

errorbox("沒有創(chuàng)建實(shí)例,不能執(zhí)行!")

end try

end sub



運(yùn)行



如圖:






當(dāng)點(diǎn)擊”創(chuàng)建實(shí)例”按鈕時,調(diào)用spooler 類的getspooler方法,試圖創(chuàng)建實(shí)例。在spooler的構(gòu)造函數(shù)中,定義了spool_counter 變量,這個變量用于計(jì)算spooler實(shí)例的數(shù)量,如果為0(即還未創(chuàng)建spooler實(shí)例),則創(chuàng)建一個spooler實(shí)例并保存。然后增加計(jì)數(shù)器的值,如果再次點(diǎn)擊”創(chuàng)建實(shí)例”按鈕,因?yàn)閟pooler實(shí)例的數(shù)量為1,則拋出異常,這樣就可以控制并創(chuàng)建唯一的實(shí)例。

構(gòu)造函數(shù)如下:

private sub new()

mybase.new()

if spool_counter = 0 then '建立并且保存這個實(shí)例

glbspooler = me '保存實(shí)例

spool_counter = spool_counter + 1 '計(jì)數(shù)

legalinstance = true

else

legalinstance = false

throw new spoolerexception

end if

end sub

可以通過修改構(gòu)造函數(shù)中對spool_counter的判斷條件來控制創(chuàng)建spooler實(shí)例的任意個數(shù)。這可以說是單件模式的擴(kuò)充吧!:)



private sub new()

mybase.new()

if spool_counter <= 3 then '建立并且保存這個實(shí)例

glbspooler = me '保存實(shí)例

spool_counter = spool_counter + 1 '計(jì)數(shù)

legalinstance = true

else

legalinstance = false

throw new spoolerexception

end if

end sub







發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 隆子县| 平顺县| 简阳市| 岑巩县| 江陵县| 增城市| 华蓥市| 鹤壁市| 永吉县| 呼玛县| 上思县| 韩城市| 崇文区| 蒙城县| 大余县| 台中市| 大英县| 香河县| 剑河县| 巴楚县| 富裕县| 镇安县| 容城县| 沈丘县| 泸水县| 且末县| 道真| 岢岚县| 南开区| 安达市| 屯留县| 博乐市| 延津县| 巴林左旗| 贵德县| 商洛市| 任丘市| 肥西县| 辉县市| 偃师市| 新野县|