单例模式的实现

  记一下学习单例模式的笔记:

  单例就是要保证该类仅有一个实例。实现完全封闭的单例(外部不能new)其实就要两点要求:

  1. 全局访问:需要一个该类型的全局静态变量,每次获取实例时都要判断它是否null,不存在new,存在通过一个方法直接返回该值获取实例来保证对象唯一;
  2. 实例化控制:new实例不能外部new、造成实例不唯一,需要一个私有构造器禁用共有构造器。

  根据new实例的时机,分为饿汉式和懒汉式:

一、 饿汉式单例:静态变量初始化时new

  特点:加载时new,一开始全局就存在该唯一实例,每次用到只要获取就行,提前占用系统资源但不存在线程安全问题。代码如下:

1     public sealed class Singleton
 2     {
 3         private static readonly Singleton instance = new Singleton();
 4         private Singleton() { }
 5
 6         public static Singleton GetInstance()
 7         {
 8             return instance;
 9         }
10     }

View Code

二、 懒汉式单例:需要该实例的时候再new

  特点:真正需要用到的时候才实例化,不提前占用资源但多个线程同时用到该实例时,会存在判断静态变量都为null都去new而产生多个实例的情况。有线程安全问题,但可以用双重锁定解决。

  单线程懒汉单例代码如下:

1     public class Singleton
 2     {
 3         private static Singleton instance = null;
 4         private Singleton() { }
 5
 6         public static Singleton GetInstance()
 7         {
 8             if (instance == null)
 9                 instance = new Singleton();
10             return instance;
11         }
12     }

View Code

  多线程懒汉单例代码如下:

1     public class Singleton
 2     {
 3         private static Singleton instance = null;
 4         private static readonly object obj = new object();
 5         private Singleton() { }
 6
 7         public static Singleton GetInstance()
 8         {
 9             //双重锁定
10             if (instance == null)//只有为null需要实例化处理时才进行加锁,提高性能避免不必要的等待
11             {
12                 lock (obj)
13                 {
14                     if (instance == null)//避免其他线程等待锁释放期间有线程已经实例化,从而造成多个实例
15                         instance = new Singleton();
16                 }
17             }
18             return instance;
19         }
20     }

View Code

三、 注册式单例

  介绍一个有意思的单例-泛型注册式,是对单例的扩展,主要了解它的设计思想。

  其实每个类单例模式实现代码都是差不多的:

  1. 相同结构和成员(字段、属性、行为等):是否可以考虑进行抽象提取一个公共的调用接口?
  2. 成员类型或输入输出具体类型不是固定的:是否可以考虑设计一个适用于不同类型的通用处理方式而不都是Object?这个适用不同类型通用解决就要用到泛型。

  实现代码如下(例子使用饿汉式,当然也可以用懒汉式):

1     public abstract class Singleton<T> where T:class,new()
 2     {
 3         private static readonly T instance = new T();
 4         protected Singleton() { }
 5
 6         public static T GetSingleton()//获取单例
 7         {
 8             return instance;
 9         }
10     }
11     public class Person : Singleton<Person> { }

View Code

  可以看到这种单例通过继承的方式,既可以new实例也可以获取单例实例。如果要实现上面的完全封闭(禁用外部new),也可以完全在Person类中写个私有构造器在Singleton<T>类中实例的获取new T()改为反射调用私有构造器的方式实现,总感觉怪怪的。

  下面是主程序调用该单例方法:

1         static void Main(string[] args)
 2         {
 3             Person p1 = Person.GetSingleton();
 4             Person p2 = Singleton<Person>.GetSingleton();
 5
 6             if (object.ReferenceEquals(p1, p2))
 7             {
 8                 Console.WriteLine("两个对象是同一实例");
 9             }
10             Console.ReadKey();
11         }
12

View Code

  输出结果:

  

(0)

相关推荐

  • 创建型模式之单例模式

    定义与特点 单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式. 例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成 ...

  • 面试高频-吃透单例设计模式

    单例设计模式 单例设计模式的介绍 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例, 并且该类只提供一个取得其对象实例的方法(静态方法). 比如 Hiber ...

  • 图解Java设计模式之单例设计模式

    图解Java设计模式之单例设计模式 设计模式介绍 设计模式类型 单例设计模式介绍 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全,同步代 ...

  • 23种设计模式入门 -- 单例模式

    单例模式:采用一定的方法,使得软件运行中,对于某个类只能存在一个实例对象,并且该类只能提供一个取得实例的方法. 分类: 饿汉式 静态常量方式 静态代码块方式 懒汉式 普通方式,线程不安全 同步方法方式 ...

  • 单例模式的八种写法

    单例模式作为日常开发中最常用的设计模式之一,是最基础的设计模式,也是最需要熟练掌握的设计模式.单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访问点.那么你知道单例模式有多少种实现方式 ...

  • 设计模式:单例模式 (关于饿汉式和懒汉式)

    定义 单例模式是比较常见的一种设计模式,目的是保证一个类只能有一个实例,而且自行实例化并向整个系统提供这个实例,避免频繁创建对象,节约内存. 单例模式的应用场景很多, 比如我们电脑的操作系统的回收站就 ...

  • java常见设计模式之---单例模式

    java常见设计模式之---单例模式 1.单例模式简介 应用场景举例 2.单例模式的特点 3.单例模式和静态类 4.单例模式的经典实现 饿汉式单例(典型实现) 饿汉式-静态代码块 懒汉式单例创建,五种 ...

  • 设计模式笔记(一):Singleton 设计模式

    今天开始学习设计模式,借此机会学习并整理学习笔记. 设计模式是一门不区分语言的课程,什么样的编程语言都可以用到设计模式.如果说java语法规则比作武功招式的话,那么设计模式就是心法. 设计模式共有23 ...

  • 单例模式

    什么是Singleton? 单例设计模式,即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式. 例如:代表JVM运行环境的Runtime类. 要点 一是某个类只能有一个实例 构造器私有化 ...

  • 设计模式(一)——Java单例模式(代码+源码分析)

    设计模式(一)——Java单例模式(代码+源码分析)

  • 设计模式之单例模式(Singleton Pattern)

    一.定义 一个类只有一个实例,且该类能自行创建这个实例的一种模式. 二.单例模式举例 例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各 ...

  • 学习单例模式引发的思考

    单例存在哪里问题? 1.单例对oop的支持不友好 OOP 四大特性: 封装 继承 多态 抽象 而单例这种设计模式对于其中的抽象 继承 多态 都支持的不好 为什么这么说呢? 我们先来看一个单例的例子 p ...

  • [软技能] 第99天 你有用过单例模式吗?主要运用场景有哪些?

    今日试题: 你有用过单例模式吗?主要运用场景有哪些? 此开源项目四大宗旨:勤思考,多动手,善总结,能坚持 <论语>,曾子曰:"吾日三省吾身"(我每天多次反省自己). 前 ...

  • 【1/25】将Game改写为单例模式(Singleton Pattern)

    这是<小游戏从0到1设计模式重构>系列内容第1篇,所有源码及资料在"程序员LIYI"公号回复"小游戏从0到1"获取. Game的实例在游戏时只有一个 ...

  • 初级必备:单例模式的7个问题

    故事 实话实说,关于单例模式,网上有N多个版本.你估计也看过很多版本.但看完了又能怎样?我技术群里的一位小伙伴,上周面试,就因为一个单例模式,然后叫他回去等通知了. 下面是这位同学被问到的问题: 1. ...

  • PHP设计模式之单例模式

    PHP设计模式之单例模式 单例模式绝对是在常用以及面试常问设计模式中排名首位的.一方面它够简单,三言两语就能说明白.另一方面,它又够复杂,它的实现不仅仅只有一种形式,而且在Java等异步语言中还要考虑 ...

  • [PHP小课堂]PHP设计模式之单例模式

    [PHP小课堂]PHP设计模式之单例模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 设计模式-单例模式

    单例模式 优点 由于单例模式在内存中只有一个实例,减少了内存开支,特别是 一个对象需要频繁地创建.销毁时,而且创建或销毁时性能又无法优 化,单例模式的优势就非常明显. 由于单例模式只生成一个实例,所以 ...