单件模式
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