0
点赞
收藏
分享

微信扫一扫

设计模式利剑二--单例模型


定    义:确保一个类只有一个实例,而且自行实例化并向这个系统提供这个类

优    点:

            1、单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁地创建、销毁时

            2、单例模式只生成一个实例,减少了系统的性能开销

            3、单例模式可以避免对资源的多重占用

            4、单例模式可以在系统设置全局的访问点,优化和共享资源访问

使用场景:

            1、要求生成唯一序列号的环境

            2、在整个项目中需要一个共享访问点和共享数据

            3、创建一个对象需要消耗的资源过多,例如访问IO以及数据库等资源

            4、需要定义大量的静态常量和静态方法的环境

深刻理解:感觉这种模式没有什么值得利用的地方,但是仔细想想,现在自己系统中的大量静态常量和静态方法Shared则完全可以采用单例

               模型,为了确保只能够申明一个对象,将new方法设置为private,那么系统中所有申明为Shared的方法都是可以全局共享

实践经验:

              首先来看一个案例,每个朝代皇帝只能够拥有一位,凡是说皇帝那大家就都知道指的谁,那么这个皇帝很定就是唯一的,不允许有第二个的,那么这个可以采取单例模式,说到皇帝那么这个类就能自动的告诉别人我是谁,我能干什么,这对天下所有人都是公开的,唯一的。那么设计出来的UML图如下所示:

设计模式利剑二--单例模型_设计模式

          仔细想想自己项目中有哪些地方可以弄成单例模式的,现在是将所有的Shared参数以及方法都是放入到BusApp中,通过BusApp.方法名称来共享这些全局变量,为了尽量遵守单一职责原则,将BusApp中的方法与变量按照职责原则分成多个类,实现UML如下图所示:

设计模式利剑二--单例模型_string_02

  单例模式的目的主要是为了为了让大家共享数据简单快捷,不用再说讲到皇帝的时候要说**皇帝,例如在家庭讲到爸爸妈妈也不需要说**爸爸,**妈妈,如果是这样那就说明这个家庭存在严重的问题了,在出现单例模式的情况下,一定记得要自己来初始化对象而非让其他对象来初始化,所以new方法一定要设置为private

      现在来看一个皇帝与臣子之间的关系,一朝天子一朝臣,很明显就是臣只能每天向一个天子朝拜,那么如何实现?先来看看类图:

设计模式利剑二--单例模型_string_03

 

     先来看看代码:

Public Class Emperor
Private Shared _emperor As Emperor = New Emperor()
Private Sub new()
End Sub
Public Shared Function getInstance() As Emperor
Return _emperor
End Function
Public Sub say()
Console.WriteLine("皇帝说:我是唐太宗李世民,大家早上好!各位都吃早餐了吧!今天早朝正式开始!")
End Sub
'''
''' <param name="words"></param>
Public Sub Answer(ByVal words As String)
Console.WriteLine("皇帝说:" & words)
End Sub
End Class ' Emperor
Private _emperor As Emperor
Public m_Emperor As Emperor
Private _ministerName As String
Public Sub New(ByVal __ministerName As String, ByVal _emperor As Emperor)
m_Emperor = _emperor
_ministerName = __ministerName
End Sub
Public Sub saytoEmperor(ByVal _words As String)
Console.WriteLine("臣子" & _ministerName & "说:" & _words)
End Sub
Sub Main()
Dim _minister1 As Minister = New Minister("秦琼", Emperor.getInstance())
Dim _minister2 As Minister = New Minister("程咬金", Emperor.getInstance())
Emperor.getInstance().say()
_minister1.saytoEmperor("皇上,今年大水,是否可以免除苏州税负!")
Emperor.getInstance().Answer("秦琼啊,你忧心为民,好,朕就免除苏州赋税1年")
_minister1.saytoEmperor("谢皇上")
_minister2.saytoEmperor("皇上,最近突厥屡犯我朝边境,请允许我带兵三万,征服突厥!")
Emperor.getInstance().Answer("程咬金啊,最近正式灾害之年,不宜出兵,多派遣商人与突厥交易,和平解决此事")
_minister2.saytoEmperor("皇上,皇上。。。。")
Emperor.getInstance().Answer("不必多言,还有没有事情,没事就退朝了!")
Emperor.getInstance().Answer("退朝")
Console.ReadLine()
End Sub

 

运行结果如下:

 

 

设计模式利剑二--单例模型_uml_04

 

举报

相关推荐

0 条评论