前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式- 单例模式(Singleton Pattern)

设计模式- 单例模式(Singleton Pattern)

作者头像
易兒善
发布2019-05-10 10:32:17
5890
发布2019-05-10 10:32:17
举报
文章被收录于专栏:挖坑填坑挖坑填坑

定义(单例模式又称单件模式)

单件模式(Singleton Pattern)要求一个类有且仅有一个实例,并且提供了一个全局的访问点,在同一时刻只能被一个线程所访问

  • 单件类只能有一个实例。
  • 单件类必须自身创建唯一实例。
  • 单件类必须给所有其它对象提供唯一实例。

C#例子

代码语言:javascript
复制
    /// <summary>
    /// 单件模式实现方式:简单线程安全。
    /// </summary>
    public sealed class Singletion
    {
        //私有构造函数,防止通过new实例化对象
        private Singletion() {
        }
        //定义一个静态变量来保存类的实例
        private static Singletion _instance;
        //定义一个标识确保线程同步
        private static readonly object _lock = new object();
        //定义公有静态方法,获取实例,并加入判断,保证实例只被创建一次
        public static Singletion GetInstance() {
            if (_instance == null) {
                //锁,多线程时,保证实例只被创建一次
                lock (_lock)
                {
                    if (_instance == null)
                    {
                        _instance = new Singletion();
                    }
                }
            }
            return _instance;
        }
        public string GetName() {
            return "我是单例模式";
        }
    }

        static void Main(string[] args)
        {
            var singletion = Singletion.GetInstance();
            Console.WriteLine( singletion.GetName());
            Console.ReadLine();
        }

单件模式参与者:

  • Singleton: 被调用的单件对象;在单件模式中,通常由Instance()或GetInstance()方法负责对象的创建,该方法应保证每个需要(单件)对象的客户端均能访问。

单件模式实现要点

  • 单件类有一个私有的无参构造函数,防止被其他类实例化。
  • 单件类不能被继承,使用sealed修饰。
  • 单件类使用静态的变量保存单实例的引用。
  • 单件类使用公有静态方法获取单一实例的引用,如果实例为null即创建一个。

单件模式使用注意点

  • 不要使用单例模式存取全局变量。这违背了单例模式的用意,最好放到对应类的静态成员中。
  • 不要将数据库连接做成单例,因为一个系统可能会与数据库有多个连接,并且在有连接池的情况下,应当尽可能及时释放连接。Singleton模式由于使用静态成员存储类实例,所以可能会造成资源无法及时释放。

单件模式适用情形

  • 当类只能有一个实例而且客户可以从一个众所周知的访问点访问时;
  • 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能适用一个扩展的实例时。

单件模式特点

  • 实例控制:Singleton会阻止其他对象实例化其自己的Singleton对象的副本,从而确保所有对象都访问唯一实例;
  • 额外的开销:虽然很小,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销;
  • 可能的开发混淆:使用Singleton对象时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类;
  • 对象的生存期问题:Singleton不能解决删除单个对象的问题。在提供内存管理的语言中(如.Net Framework的语言),只有Singleton类能够导致实例被取消分配,因为它包含该对象实例的私有引用。在某些语言中(如C++),其他类可以删除对象实例,但这样会导致Singleton类中出现悬浮引用。

其他

源码地址

dotnet-design-patterns

其他设计模式

23种设计模式

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.04.25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 定义(单例模式又称单件模式)
  • C#例子
  • 单件模式参与者:
  • 单件模式实现要点
  • 单件模式使用注意点
  • 单件模式适用情形
  • 单件模式特点
  • 其他
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档