设计模式01: Singleton 单例模式

Singleton 单例模式

动机(Motivation)
当进行软件开发是会有这样一种需求:在系统中只有存在一个实例才能确保它们的逻辑正确性、以及良好的效率。
这应该是类设计者的责任,而不是使用者的责任。

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

单线程Singleton模型实现:

 1 pulic class Singleton
 2 {
 3     private static Singleton instance;//如果客户不需要这个实例最好不要new一个实例,不要在这里new
 4
 5     private Singleton(){}//如果不写的话,将会是public的构造器,public是可以随便new的
 6
 7     public static Singleton Instance
 8     {
 9         get
10         {
11             if(instance==null)
12             {
13                 instance=new Singleton();
14             }
15             return instance;
16         }
17     }
18 }

调用:Singleton instance = Singleton.Instance;

单线程Singleton模式的几个要点:
Singleton模式总的实例构造器可以设置为protected以允许子类派生。
Single模式一般不要支持IColoneable接口,因为这可能导致多个对象实例,同样与Singleton模式的初衷违背。
Single模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们没有必要对其销毁进行特殊的处理。

多线程Singleton模型实现:

 1 class Singleton
 2 {
 3     private static volatile Singleton instance=null;//编译代码的时候编译器会对代码微调,为了禁止微调所以要加volatile
 4     private static object lockHelper=new object();
 5     private Singleton(){}
 6     public sttic Singleton Instance
 7     {
 8         get
 9         {
10             if(instance==null)
11             {
12                 lock(lockHelper)
13                 {
14                     if(instance==null)
15                     {
16                         instance=new Singleton();
17                     }
18                 }
19             }
20             return instance;
21         }
22     }
23 }

.NET自带的单例实现:

1 class Singleton
2 {
3     public static readonly Singleton Instance = new Singleton();//内联初始化
4     private Singleton(){}
5 }

等同于:

1 class Singleton
2 {
3     public static readonly Singleton Instance;//Instance在被访问之前会先走静态构造器
4     static Singleton()//静态构造器,.net类型初始化机制可以保证只有一个线程执行。静态构造器不能传递参数,它是给系统来调用的。
5     {
6         Instance=new Singleton();
7     }
8     private Singleton(){}
9 }

弊端:
不支持参数化
以单线程Singleton模型实现为例,就可以支撑参数化:

 1 pulic class Singleton
 2 {
 3     private static Singleton instance;
 4
 5     private Singleton(int x,int y)
 6     {
 7         this.x=x;
 8         this.y=y;
 9     }
10
11     public static Singleton GetInstance(int x,int y)
12     {
13         if(instance==null)
14         {
15             instance=new Singleton(x,y);
16         }
17         else
18         {
19             instance.x=x;
20             instance.y=y;
21         }
22         return instance;
23     }
24
25     int x;
26     int y;
27 }

调用:
Singleton t1=Singleton.GetInstance(100,200);
Singleton t2=Singleton.GetInstance(200,300);

其实可以用设置属性的方法也可以这实现:

 1 class Singleton
 2 {
 3     public static readonly Singleton Instance = new Singleton();//内联初始化
 4     private Singleton(){}
 5
 6     public int x
 7     {
 8         get{
 9             return this.x;
10         }
11         set{
12             this.x=x;
13         }
14     }
15     public int y
16     {
17         get{
18             return this.y;
19         }
20         set{
21             this.y=y;
22         }
23     }
24     int x;
25     int y;
26
27     /*也可以添加初始化函数(也可以带参数),来和构造器进行剥离
28     public void Init()
29     {
30         ...
31     }
32     */
33 }

Singleton模式扩展
将一个实例扩展到n个实例,例如对象池的实现。
将new构造器的调用转移到其他类中,例如多个类协同工作环境中,某个局部环境只需要拥有某个类的一个实例。
理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的实例构造器的任意调用”。

最近在看李建忠老师的 《C#面向对象设计模式纵横谈》,虽然是很多年前的视频,还是很受启发,就决定把笔记整理一遍。

时间: 2024-10-27 12:08:35

设计模式01: Singleton 单例模式的相关文章

设计模式之 Singleton 单例模式

先上两段代码,区别仅在于是否涉及线程安全. 首先是不涉及多线程的单例: public class Singleton { private final static Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } double check版的单例,线程安全:public class Singleton {

iOS.常用设计模式.01.单例模式

使用单例模式的类: UIApplication UIAccelerometer NSUserDefaults NSNotificationCenter NSFileManager NSBundle等 Singleton.h #import <Foundation/Foundation.h> @interface Singleton : NSObject // 始终返回同一个Singleton的指针 + (Singleton *)sharedManager; @property (strong,

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

转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二]外观模式(Facade) [白话设计模式三]适配器模式(Adapter) [白话设计模式四]单例模式(Singleton) [白话设计模式五]工厂方法模式(Factory Method) [白话设计模式六]抽象工厂模式(Abstract Factory) [白话设计模式七]策

“只生一个娃”--设计模式中的单例模式

"只生一个娃"–设计模式中的单例模式(Singleton) 引言 ??被人问到什么是单例模式,突然回答不上来,似乎印象不深了.回去补了一下功课,突然明白了,原来在项目中一直使用的日志模块即采用了单例模式,只是熟视无睹,没有意识到罢了. ??所谓单例模式(Singleton),即指一个类只有一个实例(Instance),并给外界提供访问该实例的一个全局访问点. ??通常我们可以使用全局变量的方式来实现"只生一个娃",但更好的方法就是:让该类自身负责创建和保存它的唯一实

php设计模式笔记:单例模式

意图: 保证一个类仅有一个实例,并且提供一个全局访问点 单例模式有三个特点: 1.一个类只有一个实例2.它必须自行创建这个实例3.必须自行向整个系统提供这个实例 主要实现: Singleton定义了一个instance操作,允许外部访问它的唯一实例,instance是一个类方法,负责创建它的唯一实例. singleton适用场景: 1.当类只能有一个实例而且外部可以从一个公共的访问点访问它.2.当这个唯一实例应该是通过子类化可扩展的.并且用户应该无需更改代码就能使用一个扩展的实例时. Singl

设计模式1:单例模式

原文地址:http://blog.csdn.net/zhengzhb/article/details/7331369 定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 类型:创建类模式 类图: 类图知识点: 1.类图分为三部分,依次是类名.属性.方法 2.以<<开头和以>>结尾的为注释信息 3.修饰符+代表public,-代表private,#代表protected,什么都没有代表包可见. 4.带下划线的属性或方法代表是静态的. 5.对类图中对象的关系不熟悉的

【我的设计模式学习】单例模式

单例模式大概是最直观的一种设计模式了.尽管直观却不简单. 数学与逻辑学中,singleton定义为"有且仅有一个元素的集合".单例模式可以如下定义:"一个类有且仅有一个实例,并且自行实例化向整个系统提供". 我比较喜欢Design Patterns 一书中的描述"保证一个类仅有一个实例,并提供一个访问它的全局访问点". 单例模式的特点 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例

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

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

《Java设计模式》之单例模式

在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容易出现问题.下面就单例设计模式详细的探讨一下. 所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在.就像是Java Web中的application,也就是提供了一个全局变量,用处相当广泛,比如保存全局数据,实现全局性的操作等. 1. 最简单的实现 首先,能够想到的最简单的实现是,把类的构造函数写成private的,从而保证别的类不能实例化此类,然后在类中提供一个静态的实例并能够返回给使用者.这样,