单例模式的微总结

[TOC]

单例模式

什么是单例模式?

单例模式是指确保一个类只有一个实例,提供一个全局访问点,不需要实例化这个类,直接调用其方法即可

1、具体步骤是

1、将类的构造函数生命为私有的构造函数,在外部就不能通过Test a= new Test()来实例化,用Private字段限制只能在内部可以实例,外部不能访问。
2、在类的里面声明一个用static修饰的公开的全局静态字段(这里就是提供给外部的唯一访问点),外部可以通过这个访问点,拿到该类的实例,static表示是静态变量,会长期占用内存,别人能够直接拿到实例

2、什么时候需要使用单例模式:

虽然使用单例模式是直接调用该类,但会长期占用内存,不会被销毁,这既是优点也是缺点,切不可为图方便就大量的使用单例

1、在系统中有不可变的参数,或者需要记录保持叠加的参数

2、为避免重复或者冲突的业务场景,需要使用单线程工作完成的场景就需要适当使用单例模式,比如:打印机业务,或者 windows 操作系统中的打开文件和桌面右键刷新都是单例模式的使用场景

3、单例模式的两种方式

懒加载方式: 指的是只有在有调用这个唯一访问点的时候才去实例化该类,当有多人调用的时候,也只有第一次调用的时候会实例化,全局只实例化一次。
饿汉模式加载方式: 指的是系统初始化的时候就已经实例化好了类,外部调不调用都在那里。

总结:

  • 在合适的场景使用单例模式,不要无节制的使用,会导致内存占用过多,甚至内存泄露等,也就是:尽量避免静态成员的使用,因为静态成员所在的实例,不会被 GC 回收
  • 优先选择静态方法调用而不是单例模式调用
  • 在单例模式中尽量使用懒加载的方式,而不是饿汉加载的方式,减少程序启动成本。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/// 定义一个私有类
private void SingleInstance() {
// 这里是处理逻辑
}

/// 实例化 饿汉模式加载
private static SingleInstance _instance = new SingleInstance();

/// 提供全局唯一访问点
public static SingleInstance GetInstance(){
return _instance;
}


/// 实例化 懒加载
private static SingleInstance _instance = new SingleInstance();

//这里顺便使用了lock(object)来锁定一个变量,达到加锁的目的,避免多个线程同时对实例执行初始化。那么如果我们lock(string 字符串类型)是否可以呢?答案是否定。
private static readonly object _lock = new object();
/// 提供全局唯一访问点
public static SingleInstance GetInstance()
{
if (_instance == null)
{
lock (_lock)
{
if (_instance == null)
{
_instance = new SingleInstance();
}
}
}
return _instance;
}

本文参考了博客园的文章,侵权联系删除 查看原文

感谢您的支持,创作更有动力