设计模式-单例模式

来源:互联网 发布:centos 6 ssh拒绝访问 编辑:程序博客网 时间:2024/06/17 14:57

一、单例模式概述

单例模式是结构最简单的设计模式。

如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个统一的·全局变量确保对象随时都可以被访问,但不能保证防止创建多个对象。一个更好的解决办法是让类自身负责创建和保存它的唯一实例,并保证不能创建其他实例,它还提供一个可以访问实例的方法,这就是到单例模式的动机。

单例模式定义:确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。

Singleton Pattern:Ensure a class has only one instance,and provide a global point of access tom it.

单例模式是一种对象创建模式。单例模式有3个要点:一是某个类只能有一个实例;二是它自行创建这个实例;三是它必须自行向整个系统提供这个实例。

二、单例模式的结构与实现

1、结构

单例模式是结构最简单的设计模式,它值包含一个类,即单例类。单例模式的结构如图所示:


图 1 单例模式结构图

 

由图可知

单例模式只包含一个单例角色----Singleton(单例),在单例类的内部创建它的唯一实例,并通过静态方法GeyInstance()让客户端可以使用它的唯一实例。为了防止在外部对单例类实例化,将其构造函数的可见性设为private,并在单例类内部定义一个Singleton类型的静态对象,作为供外部共享访问的唯一实例。

2、实现

通常单例模式的实现代码如下:

class Singleton{private static Singleton instance=null;//私有构造函数private Singleton(){}//静态公有工厂方法,返回唯一实例public static Singleton GetInstance(){if(instance==null)instance=new Singleton();return instance;}}

下面是测试代码:

using System;class Progrem{static void main(String[] args){Singleton s1=Singleton.GetInstance();Singleton s2=Singleton.GetInstance();//判断两个独享是否相同if(s1==s2){Console.Writeline("两个对象是相同实例。");}Console.Read();}}

测试代码输出:两个对象是相同实例

说明两次调用GetInstance()所获得的对象是同一个实例对象,,并无法再外部对Singleton进行实例化,因此能够确保系统中只有唯一的一个Singleton对象。

在单例模式实现的过程中,我们需要注意:

(1)单例类构造函数的可见性为private.

(2)提供一个类型为自身的静态私有成员变量。

(3)提供一个公有的静态工厂方法。


三、单例模式的分类:

1、饿汉式单例类

饿汉式单例类是实现起来最简单的单例类,结构如下:


图 2  饿汉式单例类图


由于在静态变量的时候实例化了单例类,因此在类架子啊时单例对象已创建,代码如下:

class EagerSingleton{private static EagerSingleton instance=new EagerSingleton();//私有构造函数private EagerSingleton(){}//静态公有工厂方法,返回唯一实例public static EagerSingleton GetInstance(){return instance;}}

2、懒汉式单例类与双重检查锁定

与饿汉式不同的,懒汉式单例类在第一次被引用时将自己实例化,在懒汉式单例类加载时不将自己实例化。懒汉式单例类的结构如图所示:


图 3  懒汉式单例类图


修改之后的懒汉式单例类代码如下:

class LazySingleton{private static LazySingleton instance=null;//程序运行时创建一个静态只读的辅助对象private static readonly object synRoot=new object();//构造函数private LazySingleton(){}//静态公有工厂方法,返回唯一实例public static LazySingleton GetInstance(){//第一重判断,先判断实例是否存在,不存在再加锁处理if(instance==null){//加锁的程序在某一时刻只允许一个线程访问lock(synRoot){//第二重判断if(instance==null){instance=new LazySingleton();}}}return instance;}}




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 驾驶本到期换本有扣分怎么办 b2驾驶证六年到期有扣分怎么办 驾考有效期是几年过期了怎么办? 驾考要过期了科四补考没过怎么办 驾驶证过期了可副业丢了怎么办 外地人北京驾驶本到期换本怎么办 报考驾照时电话号码填错了怎么办 报考驾照时电话填错了怎么办 邢台开三轮车驾证扣12分怎么办 新c1驾照扣满6分怎么办 b2驾照酒驾降级后再次酒驾怎么办 我b2驾照扣了9分怎么办 开别人的车出了事故怎么办 骑摩托车行驶证年检过期了怎么办 在两个城市车船税交重复了怎么办 车子被撞对方全责不赔钱怎么办 驾驶证暂扣期间该审证了怎么办 号码预约被不小心取消了怎么办 老婆出轨要跟我离婚我不想离怎么办 老婆要离婚我不想离电话拉黑怎么办 驾驶证到期换证体检有色弱怎么办 在长沙雨花区考的驾照丢了怎么办 两个户口注销了一个驾证怎么办 车管所发的初始密码弄丢了怎么办? 网上预约驾照考试密码忘记了怎么办 车是温州牌照掉了行驶证怎么办? 触犯了刑法第80条伪造印章怎么办 使用假行驶证被交警查扣车怎么办 摩托车被交警扣了没行驶证怎么办 摩托车行驶证丢了被交警抓到怎么办 摩托车没有行驶证被交警扣了怎么办 有小车执照要大在执照怎么办 报考的南京驾照不退学费怎么办 驾照报名可以退吗?不退怎么办 科目三学时已满公里数未满怎么办 预约驾照考试收不到验证码怎么办 a2驾照违章被扣24分怎么办 出车祸后划分赔偿对方不鉴字怎么办 驾驶证过期了被交警抓到怎么办 摩托车驾驶证6年到期在增驾怎么办 驾照年检时色盲图过不了怎么办