首页 > 开发 > 综合 > 正文

设计模式之单件模式(Singleton Pattern )

2024-07-21 02:16:29
字体:
来源:转载
供稿:网友

单件模式

singleton pattern



singleton 模式,它包含在创造性模式系列中。

创造性模式指示如何以及何时创建对象。singleton 模式可以保证一个类有且只有一个实例,并提供一个访问它的全局访问点。在程序设计过程中,有很多情况需要确保一个类只能有一个实例。例如,系统中只能有一个窗口管理器、一个打印假脱机,或者一个数据引擎的访问点。pc机中可能有几个串口,但只能有一个com1实例。

其结构如下:




我们可以定义一个spooler类,实现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 '建立并且保存这个实例

glbspooler = me '保存实例

spool_counter = spool_counter + 1 '计数

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 '实例已经存在

finally

getspooler = glbspooler '返回唯一的实例

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 = "只能创建一个实例!"

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 = "创建实例!"

catch ex as exception

errorbox("实例已经创建,并且只能创建一个实例!")

end try

end sub



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

try

spl.print("实例已经创建,并且你单击了按钮!")

catch ex as exception

errorbox("没有创建实例,不能执行!")

end try

end sub



运行



如图:






当点击”创建实例”按钮时,调用spooler 类的getspooler方法,试图创建实例。在spooler的构造函数中,定义了spool_counter 变量,这个变量用于计算spooler实例的数量,如果为0(即还未创建spooler实例),则创建一个spooler实例并保存。然后增加计数器的值,如果再次点击”创建实例”按钮,因为spooler实例的数量为1,则抛出异常,这样就可以控制并创建唯一的实例。

构造函数如下:

private sub new()

mybase.new()

if spool_counter = 0 then '建立并且保存这个实例

glbspooler = me '保存实例

spool_counter = spool_counter + 1 '计数

legalinstance = true

else

legalinstance = false

throw new spoolerexception

end if

end sub

可以通过修改构造函数中对spool_counter的判断条件来控制创建spooler实例的任意个数。这可以说是单件模式的扩充吧!:)



private sub new()

mybase.new()

if spool_counter <= 3 then '建立并且保存这个实例

glbspooler = me '保存实例

spool_counter = spool_counter + 1 '计数

legalinstance = true

else

legalinstance = false

throw new spoolerexception

end if

end sub







发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表