C#设计模式之Singleton单件、创建型模式(2)

**

模式分类

**
从目的来看

  • 创建型模式:负责对象创建。
  • 结果型模式:处理类与对象间的组合
  • 行为型模式:类与对象交互中职责分配

从范围来看

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

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

  • 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。

  • 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?

  • 这应该是类设计者的责任,而不是使用者的责任。

意图

  • 保证一个类仅有一个实例,并提供一个该实例的全局访问点。

单线程Singleton模式

/// <summary>
 /// 单线程Singleton模式
 /// </summary>
    public class Singleton
    {
        private static Singleton instance;
        //防止随便new
        private Singleton() { }

        //创建一个只读属性。为了每次请求都返回第一个实例。
        public static Singleton Instance {

            get {

                if (instance == null) {

                    instance = new Singleton();
                }

                return instance;
            }
        }

    }

单线程Singleton模式几个要点

  1. Singleton模式中的实例构造器可以设置为protected以允许子类派生。
  2. Singleton模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与Singleton模式的初衷违背。
  3. Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样与Singleton模式的初衷违背。
  4. Singletom模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们一般没有必要对其销毁进行特殊的管理。
  5. 不能应对多线程环境:在多线程环境下,使用Singleton模式仍然有可能得到Singleton类的多个实例对象。

多线程Singleton模式

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Singleton单件创建型模式
{/// <summary>
 /// 多线程Singleton模式
 /// </summary>
    public class Singleton1
    {
        //volatile防止编译器对代码进行微调
        private static volatile Singleton1 instance;

        private static object lockHelper = new object();
        //防止随便new
        private Singleton1() { }

        //创建一个只读属性。为了每次请求都返回第一个实例。
        public static Singleton1 Instance
        {

            get
            {

                if (instance == null)
                {
                    //线程锁
                    lock (lockHelper)
                    {
                        if (instance == null) {

                            instance = new Singleton1();
                        }
                            
                    }
                    
                }

                return instance;
            }
        }

    }
}

带参数的

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Singleton单件创建型模式
{/// <summary>
 /// 多线程Singleton模式,带参数的
 /// </summary>
    public class Singleton1
    {
        //volatile防止编译器对代码进行微调
        private static volatile Singleton1 instance;

        private static object lockHelper = new object();

        int x;
        int y;


        //防止随便new
        private Singleton1(int x,int y) {

            this.x = x;
            this.y = y;
        }

        //创建一个只读属性。为了每次请求都返回第一个实例。
        public static Singleton1 Instance(int x,int y)
        {

                if (instance == null)
                {
                    //线程锁
                    lock (lockHelper)
                    {
                        if (instance == null) {

                            instance = new Singleton1(x,y);
                        }
                            
                    }
                    
                }

                return instance;
      
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值