前言

最近面试发现自己不懂的东西还是很多的,写一波文章来巩固和挖掘欠缺的知识点以及加深对已有知识点原理的理解。

无知.jpg

什么是单例模式

  • 指一个类只有一个实例,且该类能自行创建这个实例的一种创建型设计模式。
  • 使用目的:确保在整个系统中只能出现类的一个实例,即一个类只有一个对象。对于频繁使用的对象,“忽略”创建时的开销。
  • 特点:
    • 单例类只有一个实例对象;
    • 该单例对象必须由单例类自行创建;
    • 单例类对外提供一个访问该单例的全局访问点;

如何保证实例的唯一性

那么,如何保证实例的唯一性?

Java 的解决方案之一

对于 Java 来说,要确保类的构造方法是私有的,使用 static final 的私有成员变量存放这个唯一实例。我们还要提供一个获取实例的接口(由于我们要通过类名获取实例,所以接口方法是 static 的)。实现如下:

1
2
3
4
5
6
7
public class Singleton {
private static final Singleton instance=new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}

我们知道,对于 static 的变量,类所有的实例都可以共享这个变量,我们可以直接通过类名来访问它。再使用 final 修饰这个变量,使得它不能再被改变。

戳此处深入了解 →

Python 的解决方案之一

以下为 Python 使用装饰器实现的单例模式。这里将不可变的类地址存放在了 dict 中,值为那个唯一的实例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def Singleton(cls):
_instance = {}

def getInstance(*args, **kwargs):
if cls not in _instance:
_instance[cls] = cls()
return _instance[cls]
return getInstance

@Singleton
class test_singleton:
def __init__(self):
pass

def main():
class1 = test_singleton()
class2 = test_singleton()
print('class1 id: {}, class2 id: {}'.format( id(class1), id(class2)))
print(class1 == class2)

main()

# class1 id: 1814844368152, class2 id: 1814844368152
# True

参考

评论