[Head First设计模式]一个人的平安夜——单例模式

简介: 原文:[Head First设计模式]一个人的平安夜——单例模式 系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式——建造者模式 [Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式 引言 已经不想再数这是第多少个一个人的平安夜了,一个人走在路上,发现满脑子的技术问题,也许,在技术中才能找到一点安慰吧。
原文: [Head First设计模式]一个人的平安夜——单例模式

 系列文章

[Head First设计模式]山西面馆中的设计模式——装饰者模式

[Head First设计模式]山西面馆中的设计模式——观察者模式

[Head First设计模式]山西面馆中的设计模式——建造者模式

[Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式

引言

已经不想再数这是第多少个一个人的平安夜了,一个人走在路上,发现满脑子的技术问题,也许,在技术中才能找到一点安慰吧。很多朋友一直问我,为什么那么拼,lz只是觉得“如果连自己喜欢的工作,都做不好,那么活着就太空虚了,男人么就应该对自己恨一点。如果你现在没有得到你想要的生活,只能说明你对自己还不够狠”。言归正传,说说今天的单例模式。

单例模式定义

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

大家都知道“一夫一妻制”,在中国,一个男人,有且只能有一个媳妇,如果你非要找个小三,势必会增加开销,占用更多资源。所以没资本的屌丝们,劝你们,媳妇这个对象有且只能创建一个,如果你不自量力,非要整个小三出来,像某某官员,一般不会出问题,但当小三和你媳妇争夺资源的时,势必会出现致命性的bug,信不信由你?

 单例模式类图

 (类图来自:http://www.cnblogs.com/zhili/p/SingletonPatterm.html,这里借用一下)

实现单例模式条件

通过观察上面类图可知:

1.静态的私有化字段;

private static readonly Singleton uniqueInstance = new Singleton();

2.私有构造器

  private Singleton(){ }

3.提供公共的访问该类实例的方法.

1  public static Singleton GetInstance()
2         {
3             return uniqueInstance;
4         }

常见的单例模式

一,饿汉式

 1   public sealed class Singleton
 2     {
 3         #region 饿汉式
 4         private static readonly Singleton uniqueInstance = new Singleton();
 5         private Singleton() { }
 6         public static Singleton GetInstance()
 7         {
 8             return uniqueInstance;
 9         }
10         #endregion
11     }

优点:

  1.线程安全 
  2.在类加载的同时已经创建好一个静态对象,调用时反应速度快。

3.通过sealed修饰类,阻止派生类的出现,因为派生可能会增加实例。

缺点:

  资源效率不高,可能GetInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化。

 二,懒汉式

 1  public sealed class Singleton
 2     {
 3         private static Singleton instance;
 4         //程序运行时创建一个静态的只读对象
 5         private static readonly object o = new object();          
 6         private Singleton() { }
 7         public static Singleton GetInstance()
 8         {
 9             //双重锁   
10             //先判断实例是否存在,不存在再加锁处理
11             //这样不用让线程每次都加锁,保证了线程安全,也提高了性能
12             if (instance == null)
13             {
14                 //保证只有一个线程
15                 lock (o)   
16                 {
17                     ///若实例不存在,则new一个新实例,否则返回已有的实例      
18                     if (instance == null)
19                     {
20                         instance = new Singleton();
21                     }
22                 }
23             }
24             return instance;
25         }
26     }

懒汉式面临线程安全的问题,通过双重锁定这样的处理才可以保证安全。

测试

 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Singleton singleton1 = Singleton.GetInstance();
 6             Singleton singleton2 = Singleton.GetInstance();
 7             if (singleton1==singleton2)
 8             {
 9                 Console.WriteLine("两个对象一样");
10             }
11             Console.Read();
12         }
13     }

结果

本打算创建个对象,给我买个苹果的,看来两个对象一样,也只能自己给自己买了。

总结

单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。

目录
相关文章
|
设计模式 缓存 安全
【设计模式】【创建型模式】单例模式(Singleton)
一、入门 什么是单例模式? 单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。它常用于需要全局唯一对象的场景,如配置管理、连接池等。 为什么要单例模式? 节省资源 场景:某些对象创
528 15
|
设计模式 安全 Java
设计模式:单例模式
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。它通过私有化构造函数、自行创建实例和静态方法(如`getInstance()`)实现。适用于数据库连接池、日志管理器等需要全局唯一对象的场景。常见的实现方式包括饿汉式、懒汉式、双重检查锁、静态内部类和枚举。线程安全问题可通过`synchronized`或双重检查锁解决,同时需防止反射和序列化破坏单例。优点是避免资源浪费,缺点是可能增加代码耦合度和测试难度。实际开发中应优先选择枚举或静态内部类,避免滥用单例,并结合依赖注入框架优化使用。
|
设计模式 存储 安全
设计模式2:单例模式
单例模式是一种创建型模式,确保一个类只有一个实例,并提供全局访问点。分为懒汉式和饿汉式: - **懒汉式**:延迟加载,首次调用时创建实例,线程安全通过双重检查锁(double check locking)实现,使用`volatile`防止指令重排序。 - **饿汉式**:类加载时即创建实例,线程安全但可能浪费内存。 示例代码展示了如何使用Java实现这两种模式。
391 4
|
设计模式 存储 安全
设计模式-单例模式练习
单例模式是Java设计模式中的重要概念,确保一个类只有一个实例并提供全局访问点。本文详解单例模式的核心思想、实现方式及线程安全问题,包括基础实现(双重检查锁)、懒汉式与饿汉式对比,以及枚举实现的优势。通过代码示例和类图,深入探讨不同场景下的单例应用,如线程安全、防止反射攻击和序列化破坏等,展示枚举实现的简洁与可靠性。
287 0
|
设计模式 存储 前端开发
前端必须掌握的设计模式——单例模式
单例模式是一种简单的创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。适用于窗口对象、登录弹窗等场景,优点包括易于维护、访问和低消耗,但也有安全隐患、可能形成巨石对象及扩展性差等缺点。文中展示了JavaScript和TypeScript的实现方法。
786 13
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
273 2
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
313 4
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
184 0

热门文章

最新文章