欢迎光临
我们一直在努力

设计模式之单件模式(Singleton Pattern )-.NET教程,Asp.Net开发

建站超值云服务器,限时71元/月

单件模式

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

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 设计模式之单件模式(Singleton Pattern )-.NET教程,Asp.Net开发
分享到: 更多 (0)