单例模式----

单例模式介绍

  这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
  这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
  注意:
    1、单例类只能有一个实例。
    2、单例类必须自己创建自己的唯一实例。
    3、单例类必须给所有其他对象提供这一实例。
  优点:
    1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
    2、避免对资源的多重占用(比如写文件操作)。
  缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
  【Java】注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。

C# - 单例模式

 懒汉式

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public class Singleton

{

    /// <summary>

    /// 构造方法私有化

    /// </summary>

    private Singleton()

    {}

    private static Singleton _singleton = null;

    public static Singleton getInstance()

    {

        if (_singleton == null)

        {

            _singleton = new Singleton();

        }

        return _singleton;

    }

}

 饿汉式

1

2

3

4

5

6

7

8

9

10

11

12

13

public class Singleton

{

    /// <summary>

    /// 构造方法私有化

    /// </summary>

    private Singleton()

    {}

    private static Singleton _singleton = new Singleton();

    public static Singleton getInstance()

    {

        return _singleton;

    }

}

同步锁【防止多线程被重复创建】

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

public class Singleton

{

    private Singleton()

    {}

    private static Singleton _singleton = null;

    private static object Singleton_Lock = new object(); //锁同步

    public static Singleton getInstance()

    {

        if (_singleton == null//双if + lock

        {

            lock(Singleton_Lock)

            {

                if (_singleton == null)

                {

                    _singleton = new Singleton();

                }

            }

        }

        return _singleton;

    }

}

 静态变量实现单例模式

1

2

3

4

5

6

7

8

9

10

11

12

13

public class Singleton

{

    private Singleton()

    {}

    private static readonly Singleton _singleton = new Singleton();

    public static Singleton GetInstance

    {

        get

        {

            return _singleton;

        }

    }

}

 是不是觉得很优雅, 利用静态变量去实现单例,  由CLR保证,在程序第一次使用该类之前被调用,而且只调用一次

 PS: 但是他的缺点也很明显, 在程序初始化后, 静态对象就被CLR构造了, 哪怕你没用。

 静态构造函数实现单例模式

1

2

3

4

5

6

7

8

9

10

11

12

public class Singleton

{

    private static readonly Singleton _singleton = null;

    static Singleton()

    {

        _singleton = new Singleton();

    }

    public static Singleton GetInstance()

    {

        return _singleton;

    }

}

 静态构造函数:只能有一个,无参数的,程序无法调用 。

 同样是由CLR保证,在程序第一次使用该类之前被调用,而且只调用一次。同静态变量一样, 它会随着程序运行, 就被实例化, 同静态变量一个道理。

 单例模式中的延迟加载

 延迟加载或延迟加载是一种设计模式,或者您可以说这是一个概念,通常用于将对象的初始化延迟到需要时。因此,延迟加载的主要目标是按需加载对象,或者您可以根据需要说出对象。

 作为 .NET Framework 4.0 的一部分引入的惰性关键字为惰性初始化(即按需对象初始化)提供了内置支持。如果要使对象(如 Singleton)以延迟初始化,则只需将对象的类型(单例)传递给lazy 关键字,如下所示。

1

2

3

4

5

6

7

8

9

10

11

12

13

public class Singleton

{

    private Singleton()

    {}

    private static readonly Lazy<Singleton> _singletonLock = new Lazy<Singleton>(() => new Singleton());

    public static Singleton GetInstance

    {

        get

        {

            return _singletonLock.Value;

        }

    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值