`

深入浅出单例模式

阅读更多

从现在看来,学习设计模式是很久之前的事了,刚开始的时候对设计模式的理解真的很浅,基本就是处于表面,不知道怎么在系统中应用。现在小组开始合作做系统了,在系统中使用设计模式,能更好的实现代码复用,让自己的系统更好的做到低耦合高内内,同时对于后期的扩展和维护也更加的方便。

这篇博客我们主要重新回顾和认识单例模式:

 

单例模式(Singleton):

 

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

 

结构图:

 


C#语言的实现代码:

 

<span style="font-family:Microsoft YaHei; font-size:18px">class Singleton
    {
        //定义一个私有变量,保存创建的实例
        private static Singleton instance;
        //私有的构造方法,外界不能利用New创建此类实例
        private Singleton () 
        {
        }
        //提供一个静态方法,用于返回唯一的Singleton实例
        public static Singleton GetInstance()
        {
            //如果instance为null,表明还没有创建Singleton对象
            //如果instance不为null,则表明已经创建了Singleton对象,将不会执行该方法
            if (instance == null) 
            {
                //创建一个Singleton对象,并将缓存起来
                instance = new Singleton();
            }
            return instance;
        }
    }</span>
<span style="font-family:Microsoft YaHei; font-size:18px"> //客户端代码
        static void Main(string[] args)
        {
            //创建Singleton对象不能通过构造器,只能通过getInstance方法
            Singleton s1 = Singleton.GetInstance();
            Singleton s2 = Singleton.GetInstance();

            if (s1 == s2) //比较两次实例化对象的结果是实例相同
            {
                Console.WriteLine("两个对象是相同的实例。");
            }
            Console.Read();
        }</span>

 

下面我们使用vb.net语言,实现单例模式

 

首先建立一个Windows应用程序,默认的窗体为Form1,设置它的ISMdiContainer属性为true,表示它是一个多文档界面MdI子窗体的容器。然后建立button按钮,我们再创建一个窗体ChildForm,单击就创建一个子窗体。

在没有使用单例模式的时候,子窗体会显示多个(如图1),但这并不是我们想要的结果,我们想要图2中显示的,无论单击多少次,只显示一个子窗体,此时我们就用到了单例模式。

图1

图2

 

下面我们按照我们上面的代码照葫芦画瓢就好。

 

 

Public Class ChildForm
    ' 定义一个私有变量,保存创建的实例
    Private Shared instance As ChildForm
    '私有的构造方法,外界不能利用New创建此类实例(我们没有写),所有类都有构造方法,不编码则系统默认生成空的构造方法
    ' 提供一个静态方法,用于返回唯一的Singleton实例
    Public Shared Function CreateForm() As ChildForm
        '如果instance不存在或关闭时, 表明还没有创建ChildForm对象
        '如果instance存在时, 则表明已经创建了ChildForm对象, 将不会执行该方法
        If instance Is Nothing OrElse instance.IsDisposed = True Then
            '创建一个ChildForm对象,并将缓存起来
            instance = New ChildForm
            instance.MdiParent = Form.ActiveForm
        End If
        Return instance '返回实例化结果
    End Function
End Class
'客户端代码
Public Class Form
    Private Sub btnShow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnShow.Click
        '单击显示子窗体
        ChildForm.CreateForm().Show()
    End Sub
End Class

 

单例模式的优点和缺点:

 

优点:

1、保证该类只有唯一的实例。

2、该类自身负责保存实例,并保证没有其他实例可以被创建。

3、向整个系统公开实例接口,对唯一实例的受控访问。

所有的设计模式都是一样的,既有优点也有缺点,我们利用它的优点的同时,不能忽略他的缺点,在多线程的程序中,多个线程同时访问,会造成创建多个实例,存在不安全问题。

分享到:
评论

相关推荐

    深入浅出单例Singleton模式

    深入浅出Singleton,详细掌握单例模式

    深入浅出设计模式

    深入浅出设计模式,比head first更易懂,共讲解了22种设计模式: 工厂模式 单例模式 建造模式 原型模式 适配器模式 桥梁模式 组合模式 装饰模式 门面模式 享元模式 代理模式 责任链模式 命令模式 解析器模式 迭代器...

    深入浅出设计模式之单件模式

    将《Head First 设计模式》(中文版)按章节进行了分割,每章一个文件,方便大家下载。

    多线程单例模式并发访问

    深入浅出:讲解单例模式,多线程安全和并发访问问题.让你轻松应对面试

    深入浅出java设计模式(高清中文PDF)

    单例模式 3.建造模式 4.原型模式 5.适配器模式 6.桥梁模式 7.组合模式 8.装饰模式 9.门面模式 10.享元模式 11.代理模式 12.责任链模式 13.命令模式 14.解释器模式 15.迭代器模式 16.调停者模式 17....

    深入浅出设计模式(中文版)

    3.6SingletonPattern(单例模式) 82 3.6.1定义 82 3.6.2现?抵械牡ダ??猈indowsTaskManager 83 3.6.3C#实例——负载均衡控制器 84 3.6.4Java实例——系统日志 86 3.6.5DoubleCheckLocking(双检锁) 89 3.6.6...

    深入浅出设计模式(中文版电子版)

    3.6SingletonPattern(单例模式) 82 3.6.1定义 82 3.6.2现?抵械牡ダ??猈indowsTaskManager 83 3.6.3C#实例——负载均衡控制器 84 3.6.4Java实例——系统日志 86 3.6.5DoubleCheckLocking(双检锁) 89 3.6.6...

    小D深入浅出设计模式+框架源码剖析实战

    │ 3.4单例模式中的饿汉实现和选择问题.mp4 │ 3.5JDK源码里面的单例设计模式.mp4 │ 4.2电商支付应用案例-简单工厂模式实践指南.mp4 │ 5.1-创建型设计模式-Prototype原型设计模式实战《上》.mp4 │ 5.2-创建...

    Java设计模式教程

    该资料介绍Java各类开发模式,包含以下教程:《深入浅出设计模式(中文版)》《Java单例模式》《Java设计模式-图解-附代码》《JAVA设计模式之单例模式(完整版)》《Java学习笔记(必看经典)》《Java总复习》《单例模式》...

    Java设计模式 版本2

    前言,UML建模技术,深入浅出UML类图,从招式与内功谈起——设计模式概述,面向对象设计原则,工厂三兄弟之简单工厂模式,工厂三兄弟之工厂方法模式,工厂三兄弟之抽象工厂模式,确保对象的唯一性——单例模式,...

    design-pattern-java.pdf

    扩展系统功能——装饰模式(三) 扩展系统功能——装饰模式(四) 外观模式-Facade Pattern 深入浅出外观模式(一) 深入浅出外观模式(二) 深入浅出外观模式(三) 享元模式-Flyweight Pattern 实现对象的复用——...

    最新设计模式超级详解+Tomcat架构源码分析+Spring源码分析 资深级设计模型课程

    最新设计模式超级详解课程,课程深入浅出的探讨了设计模式总览,创建型模式、结构型模式、行为模式的技术教学堪称经典。Spring源码分析,web源码分析,Tomcat架构源码分析都是非常深入的源码级课程,期待研究设计...

    Java性能调优实战——覆盖80%以上的Java应用调优场景

    开篇词讲怎样才能做好性能调优02讲如何制定性能调优策略04讲慎重使用正则表达式05讲ArrayList还是LinkedList使用不当性能差千倍07讲深入浅出HashMap的设计与优化08讲网络通信优化之IO模型:如何解决高并发下IO瓶颈09...

    Java实例高难度面试题及解析 - 展现你的编程实力!

    您将了解如何正确创建对象实例、访问实例的成员变量和方法、实现对象的拷贝(包括浅拷贝和深拷贝)、判断对象相等性、管理对象的生命周期、实现线程安全的单例模式等。此外,我们还探讨了对象的哈希码、重写equals()...

    传智播客扫地僧视频讲义源码

    本教程共分为5个部分,第一部分是C语言提高部分,第二部分为C++基础部分,第三部分为C++进阶部分,第四部分为C、C++及数据结构基础部分,第五部分为C_C++与设计模式基础,内容非常详细. 第一部分 C语言提高部分目录...

Global site tag (gtag.js) - Google Analytics