定义

保证一个类仅有一个实例,并提供一个该实例的全局访问点。  --《设计模式GoF》

UML类图

使用场景

  1. 当类只能有一个实例并且用户可以从一个众所周知的访问点访问它时。
  2. 创建一个对象需要消耗过多的资源,比如IO和数据库连接等。

C#代码实现

1,初始版本

namespace DesignPatternDemo.ConsoleApp
{
/// <summary>
/// 单例类
/// </summary>
public class Singleton
{
private static Singleton _singleton; private Singleton()
{ } public static Singleton GetInstance()
{
if (_singleton== null)
{
_singleton = new Singleton();
} return _singleton;
} }
}

注意:此版本在多线程环境下不能保证线程安全!

2,双检锁

namespace DesignPatternDemo.ConsoleApp
{
/// <summary>
/// 单例类(双检锁)
/// </summary>
public class SingletonV2
{
private static SingletonV2 _singleton;
private static readonly object lockObj = new object(); private SingletonV2()
{ } public static SingletonV2 GetInstance()
{
if (_singleton == null)
{
lock (lockObj)
{
if (_singleton == null)
{
_singleton = new SingletonV2();
}
}
} return _singleton;
}
}
}

总结:双检锁版本解决了多线程环境下线程安全的问题。

3,饿汉式版本

namespace DesignPatternDemo.ConsoleApp
{
/// <summary>
/// 单例类(饿汉式版本)
/// </summary>
public class SingletonV3
{
private static readonly SingletonV3 _singleton = new SingletonV3(); private SingletonV3()
{ } public static SingletonV3 GetInstance()
{
return _singleton;
} }
}

总结:这个版本的优点是实现简单并且没有加锁执行效率高,缺点是类加载时就初始化,可能会浪费内存资源。

4,测试

namespace DesignPatternDemo.ConsoleApp
{
class Program
{
static void Main(string[] args)
{
SingletonV2 singleton1 = SingletonV2.GetInstance();
SingletonV2 singleton2 = SingletonV2.GetInstance(); if (singleton1 == singleton2)
{
Console.WriteLine("对象singleton1和对象singleton2是同一个对象!");
} Console.ReadKey();
}
}
}

运行结果:

设计模式系列1:单例模式(Singleton Pattern)的更多相关文章

  1. 设计模式系列之单例模式(Singleton Pattern)——确保对象的唯一性

    模式概述 模式定义 模式结构图 饿汉式单例与懒汉式单例 饿汉式单例 懒汉式单例 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 适用场景 说明:设计模式系列文章是读刘伟所著 ...

  2. 设计模式系列之单例模式(Singleton Pattern)

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.这种模式涉及到一个单一的类,该类负责创建自己的对象 ...

  3. Net设计模式实例之单例模式( Singleton Pattern)

    一.单例模式简介(Brief Introduction) 单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点.单例模式因为Singleton封装它的唯 ...

  4. 浅谈设计模式--单例模式(Singleton Pattern)

    题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...

  5. 设计模式之单例模式(Singleton Pattern)

    单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...

  6. 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)

    原文:乐在其中设计模式(C#) - 单例模式(Singleton Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 单例模式(Singleton Pattern) 作者:weba ...

  7. 【设计模式】单例模式 Singleton Pattern

    通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例(Instance)  的情况, 比如说我们想做一计数器,统计某些接口调用的次数,通常我们的数据库连接也是只期望有一个实例.Windo ...

  8. 二十四种设计模式:单例模式(Singleton Pattern)

    单例模式(Singleton Pattern) 介绍保证一个类仅有一个实例,并提供一个访问它的全局访问点. 示例保证一个类仅有一个实例. Singleton using System; using S ...

  9. 【白话设计模式四】单例模式(Singleton)

    转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...

  10. 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)

    在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...

随机推荐

  1. 原生js实现canvas气泡冒泡效果

    说明: 本文章主要分为ES5和ES6两个版本 ES5版本是早期版本,后面用ES6重写优化的,建议使用ES6版本. 1, 原生js实现canvas气泡冒泡效果的插件,api丰富,使用简单2, 只需引入J ...

  2. webpack,配置,上手,例子

    1.webpack是什么? 2.为什么要用webpack? 3.怎么用webpack? webpack是什么? 答:webpack是前端模块化应用和开发的打包工具,解决前端模块依赖的工具.打包所有的脚 ...

  3. 加密原理介绍,代码实现DES、AES、RSA、Base64、MD5

    阅读目录 github下载地址 一.DES对称加密 二.AES对称加密 三.RSA非对称加密 四.实际使用 五.关于Padding 关于电脑终端Openssl加密解密命令 关于网络安全的数据加密部分, ...

  4. idea快捷

    IntelliJ Idea 常用快捷键 列表(实战终极总结!!!!) 1. -----------自动代码-------- 常用的有fori/sout/psvm+Tab即可生成循环.System.ou ...

  5. 利用Django进行Web开发

    Web就是用来表示Internet主机上供外界访问的资源的.网页也统称为web资源.Internet上供外界访问的Web资源主要分为如下两类: 静态web资源:指web页面中供人们浏览的数据始终是不变 ...

  6. BigDecimal 专题

    //****BigDecimal中传入的double类型的数据,要为String类型,不然得到在BigDecimal仍然是不准确的double数据**** // BigDecimal addend = ...

  7. Java 读书笔记 (十六) Java 继承

    例: 开发动物类,其中动物分别为企鹅以及老鼠,要求如下: 企鹅: 属性(姓名,id), 方法(吃,睡,自我介绍) 老鼠: 属性(姓名,id), 方法(吃,睡,自我介绍) 企鹅类: public cla ...

  8. stack的empty()

    public static void main(String[] args) { Stack stack=null; System.out.println("1."+stack.e ...

  9. Dubbo中消费者初始化的过程解析

    首先还是Spring碰到dubbo的标签之后,会使用parseCustomElement解析dubbo标签,使用的解析器是dubbo的DubboBeanDefinitionParser,解析完成之后返 ...

  10. sprintf、strcpy 及 memcpy 函数区别

    这些函数的区别在于 实现功能 以及 操作对象 不同.strcpy 函数操作的对象是 字符串 ,完成 从 源字符串 到 目的字符串 的 拷贝 功能. sprintf 函数操作的对象 不限于字符串 :虽然 ...