设计模式:单件(Singleton)

在构建应用程序时,需要实现唯一实例化对象的类,并提供该实例的全局访问入口,以性能和框架能力为前提,还要考虑线程安全。

单件模式实现方式之一:简单实现,存在线程安全问题

    public sealed class Singleton
    {
        private static Singleton instance;

        private Singleton()
        {
        }

        /// <summary>
        /// 获取单件实体方法
        /// </summary>
        /// <returns>单件实体</returns>
        public static Singleton GetInstance()
        {
            if (instance == null)
            {
                instance = new Singleton();
            }

            return instance;
        }
    }

单件模式实现方式之二:由框架支持的方式,通过static和readonly的组合实现线程安全。微软的单件实现策略之一——静态初始化。

本方式是“设计模式:可重用面向对象软件元素[Gamma95]”的推荐方式,只是利用了C#的语言特性。

    public sealed class Singleton
    {
        private static readonly Singleton instance = new Singleton();

        private Singleton()
        {
        }

        /// <summary>
        /// 获取单件实体方法
        /// </summary>
        /// <returns>单件实体</returns>
        public static Singleton GetInstance()
        {
            return instance;
        }
    }

单件模式实现方式之三:通过标记为同步方法同时只有一个线程能够进入,不过同步操作是非常昂贵的操作,阻塞会导致性能损耗。

    public sealed class Singleton
    {
        private static Singleton instance;

        private Singleton()
        {
        }

        /// <summary>
        /// 获取单件实体方法
        /// </summary>
        /// <returns>单件实体</returns>
        [MethodImpl(MethodImplOptions.Synchronized)]
        public static Singleton GetInstance()
        {
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }

单件模式实现方式之四:多线程的单件实现方式,避免了昂贵的同步操作,双重检查锁定方法避免阻塞和冲突的发生。

    public sealed class Singleton
    {
        private static Singleton instance;
        private static object syncLock = new object();

        private Singleton()
        {
        }

        /// <summary>
        /// 获取单件实体方法
        /// </summary>
        /// <returns>单件实体</returns>
        public static Singleton GetInstance()
        {
            if (instance == null)
            {
                lock (syncLock)
                {
                    if (instance == null) instance = new Singleton();
                }
            }
            return instance;
        }
    }

参考链接:

Implement Singleton in C# https://msdn.microsoft.com/en-us/library/ff650316.aspx

时间: 2024-10-10 15:45:49

设计模式:单件(Singleton)的相关文章

设计模式 单件-Singleton

单件模式 Singleton 什么时候使用?当需要独一无二的对象时,请想起他. 举例:线程池(threadpool),缓存(cache),对话框,处理偏好设置和注册表(registry)的对象,驱动程序对象. 无需具体例子,先看类图:包含一个private的自己的实例.private的构造函数,确保无法在类以外创建.在getInstance()中检测私有实例是否创建,未则创建,若已存在则直接返回. 看代码更好理解记忆. 经典实现方式 Typical Singleton public class

设计模式 - 单件模式(singleton pattern) 详解

单件模式(singleton pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28595349 单件模式(singleton pattern) : 确保一个类只有一个实例, 并提供一个全局访问点. 单价模式包括3个部分: 私有构造器, 静态变量, 静态方法. 具体方法: 1. 标准的单例模式: /** * @time 2014.6.5 */ package singleton; /** * @author

设计模式之Singleton(单例)

设计模式之Singleton(单态) 板桥里人 http://www.jdon.com 2002/05/07 定义:Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作. 还有, singleton能够被状态化; 这样,多个单态类在一起就可以作为一个状态仓库一样向外提供服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持住这个计数,并且能synchronize的安全自动加1,

设计模式学习--Singleton

What Singleton:保证一个类仅有一个实例,并提供一个访问它的全局访问点. Why Singletion是我比较熟悉的设计模式之一,在平常的开发过程中,也曾几次用到,它主要适用于如下场景: 1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时. 2.当这个唯一实例应该是通过子类可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时. 在系统设计中,在涉及系统资源的管理时,往往会被设计成Singletion模式,比如缓存.日志对象.线程池.对话框等等. How 假设如下场

php设计模式——单例模式(Singleton)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 谷歌的Android设备 华为的Android设备 IOS只属于苹果公司 IOS只属于苹果公司 1 <?php 2 3 /* 4 * php

Objective-c 单例设计模式(Singleton)

单例是一种重要的概念,它是一种极其便利的设计模式.在iPhone SDK中大量使用了单例的概念,例如,UIApplication的sharedApplication方法,任何时候都会返回一个当前应用程序的UIApplication实例. 有时候我们在一个程序几乎所有的地方都要使用某一数据并且要对其进行操作并且这个数据是单一的,全局只需要一个,这种情况下我们也许就会使用单例了 虽然单例很好用,但是不要滥用,因为单例会再程序运行过程中一直存在,不会被销毁(相当于直接在内存上扒了一块下来) 之前公司的

Swift语言下的单例设计模式实现(SINGLETON)

一.意图 保证一个类公有一个实例,并提供一个访问它的全局访问点. 二.使用场景 1.使用场景 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时. 2.实现的重要三个步骤 私有化构造方法(Swift不支持) 使用一个静态变量保存实例的引用 提供一个全局的访问方法 三. Swift语言下的实现 Swift语言不支持变量及方法的权限,没有办法隐藏变量及方法,可以随意直接创建一个实例.单例的创建有很多写

Java 设计模式 单例模式(Singleton) [ 转载 ]

Java 设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创建对象 第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 private Singleton (){} 4 5 public static Singleton getInstan

Android设计模式——单例模式(Singleton)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import

单态设计模式(Singleton pattern)

单态(单例)设计模式 单态设计模式(Singleton pattern)就是要保证在整个程序中某个类只能存在一个对象,这个类不能再创建第二个对象. 单态设计模式的写法 私有化构造函数,阻止创建新对象. 单例设计模式: 在内存中对象只有一个存在. */ //饿汉式 class Student { private Student(){} private static Student s = new Student(); public static Student getInstance() { re