设计模式笔记 1.Singleton 单例模式(创建型模式)

 

1. Singleton 单例模式(创建型模式)   

模式分类

从目的来看:

创建型(Creational)模式:将对象的部分创建工作延迟到子类或者其他对象,从而应对需求变化为对象创建时具体类型实现引来的冲击。

结构型(Structural)模式:通过类继承或者对象组合获得更灵活的结构,从而应对需求变化为对象的结构带来的冲击。

行为型(Behavioral)模式:通过类继承或者对象组合来划分类与对象间的职责,从而应对需求变化为多个交互的对象带来的冲击。

从范围来看:

类模式处理类与子类的静态关系;对象模式处理对象间的动态关系。

动机(Motivation)

在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。

如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种封装机制来避免客户程序和这种具体对象创建工作的紧耦合?

意图(Intent

单例模式保证应用只有一个全局唯一的实例,并且提供一个访问它的全局访问点。

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。                        ——《设计模式》 GoF

 

 

单线程的实现:

class Singleton

{

    //单线程时的单例模式

    private static Singleton instance;

 

    //构造方法让其private,这就堵死了外界利用new创建此类实例的可能

    private Singleton()

    {

    }

 

    public static Singleton GetInstance()//此方法是获得本类实例的唯一全局访问点          

    {

        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("Objects are the same instance");

    }

 

    Console.ReadLine();

}

 

多线程的实现:

class Singleton

{

    //多线程时的单例模式

    private static Singleton instance;

    private static readonly object syncRoot = new object();

//程序运行时创建一个静态只读的进程辅助对象

 

    private Singleton()

    {

    }

 

    public static Singleton GetInstance()

    {

        if (instance == null)

//先判断实例是否存在,不存在再加锁处理,可以提高性能(双重锁定)

        {

            lock (syncRoot)//在同一个时刻加了锁的那部分只有一个线程可以进入

            {

                if (instance == null)

                {

                    instance = new Singleton();

                }

 

                return instance;

            }

        }

        return instance;

    }

}

 

静态初始化:(能够达到同样的效果)

class Singleton

{

    //静态初始化

    public sealed class Singleton //sealed阻止发生派生,而派生可能会增加实例

    {

        private static readonly Singleton instance = new Singleton();

        //在第一次引用类的任何成员时创建实例,公共语言运行库负责处理变量初始化

 

        private Singleton() { }

 

        public static Singleton GetInstance()

        {

            return instance;

        }

    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值