设计模式学习笔记1--单例模式

来源:互联网 发布:编写java 用什么软件 编辑:程序博客网 时间:2024/06/03 19:38

单例模式:全局访问+实例化控制

做法:定义Singleton类,让类自身负责保存它的唯一实例,并提供一个访问该实例的方法。
结构图:
这里写图片描述

1、保证一个类仅有一个实例。
2、可实现对唯一实例的受控访问(可严格控制客户怎样访问、何时访问)。

代码:

class Singleton{    private static Singleton instance;    private Singleton()    {    }//private构造方法,堵死外界利用new创建此类实例的可能    public static Singleton Getstance()    {        //此方法是获得本实例的唯一全局访问点        if(instance==null)        {            //若实例不存在,则new一个,否则返回已有实例            instance=new Singleton();        }        return instance;    }}static void Main(string[] args){    Singleton s1=Singleton.GetInstance();    Singleton s2=Singleton.GetInstance();    if(s1==s2)        Console.WriteLine("两个对象是相同的实例");    Console.Read();}

多线程时的单例

如何保证多线程环境下的同时访问也不会造成多个实例的生成?

双重锁定: Double-Check Locking
lock是确保当一个线程位于代码的临界区内,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。

代码:

class Singleton{    private static Singleton instance;    //程序运行时创建一个静态只读的进程辅助对象    private static readonly object syncRoot=new object();    private Singleton()    {    }    public static Singleton Getstance()    {        if(instance==null)        {//先判断实例是否存在,不存在再加锁处理            lock(syncRoot)            {                if(instance==null)                {                    instance=new Singleton();                }            }        }        return instance;    }}static void Main(string[] args){    Singleton s1=Singleton.GetInstance();    Singleton s2=Singleton.GetInstance();    if(s1==s2)        Console.WriteLine("两个对象是相同的实例");    Console.Read();}

静态初始化

C#与公共语言运行库提供了一种“静态初始化”方法,这种方法不需要开发人员显式地编写线程安全代码,即可解决多线程环境下它是不安全的问题。

饿汉式单例类: 在自己被加载前就将自己实例化。
代码:

//阻止发生派生(派生可能会增加实例)public sealed class Singleton{//在第一次引用类的任何成员时创建实例。公共语言运行库负责处理变量初始化    private static readonly Singleton instance=new Singleton();    private Singleton()    {    }    public static Singleton Getstance()    {        return instance;    }}

饿汉式单例类 VS 懒汉式单例类
饿汉式:
1、依赖公共语言运行库来初始化变量。
2、静态初始化的方式,它是类一加载就实例化的对象,所以需要提前占用系统资源。
懒汉式:
1、需要做双重锁定才能保证多线程访问的安全性问题。
2、在第一次被引用时,才会将自己实例化。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 天翼校园开wifi怎么办 校园卡不给销户怎么办 吃腻了难受恶心怎么办 深夜吃撑了难受怎么办 吃撑了肚子难受怎么办 喝水喝撑了难受怎么办 晚饭吃撑了难受怎么办 吃多了肚子难受怎么办 电信4g信号变3g怎么办 五险交了3月离职怎么办 怎么办工行携程灵通卡 易买得消费卡怎么办 贷款回执单丢了怎么办 医院挂号过号了怎么办 脑子里总是胡思乱想睡不着怎么办 被妹夫给睡了怎么办 被妹夫抱了下怎么办 最里面牙齿烂了怎么办 老公有外遇不承认怎么办 对老公疑心太重怎么办 当你发现老公出轨怎么办 发现自己老婆出轨了怎么办 笔袋密码忘记了怎么办 海关锁密码忘了怎么办 800度近视献了血怎么办 当老公有了外遇妻子该怎么办 妻子有外遇我该怎么办 喜欢拔粗的头发怎么办 小腿长水泡很痒怎么办 脚丫有水泡又痒怎么办 脚上起水泡怎么办很疼 脚上反复长水泡怎么办 高考没考上二本怎么办 车子被扣了60分怎么办 科目三挂了三次怎么办 装修到一半跑了怎么办 13岁自慰被发现怎么办 应用锁密码忘了怎么办 3d缺少dll文件怎么办 真三国无双6闪退怎么办 孙策死了大乔怎么办