国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 辽中县| 扎赉特旗| 奎屯市| 沧州市| 名山县| 河北区| 屯昌县| 渑池县| 武胜县| 财经| 阳谷县| 博罗县| 弥渡县| 汉中市| 淳化县| 宜良县| 抚州市| 调兵山市| 澄江县| 榆中县| 闵行区| 定日县| 松江区| 弥勒县| 南投市| 安平县| 福清市| 涡阳县| 贵港市| 合阳县| 英德市| 蒙阴县| 吉安市| 土默特右旗| 崇仁县| 娱乐| 龙胜| 柳河县| 罗山县| 扬州市| 元氏县|