软考
APP下载

单例模式实例

单例模式是一种常见的设计模式,用于确保一个类仅能有一个实例,并提供全局访问点。本文将从多个角度分析单例模式的实例化方法和使用场景。

1. 懒加载方式实现

懒加载方式是最常见的单例模式实现方式,也被称为“懒汉式”。这种方式会在第一次调用时进行实例化,并使用一个私有变量存储实例。以下是一个基于懒加载方式的单例模式实例的示例代码:

```python

class Singleton:

__instance = None

def __init__(self):

if not Singleton.__instance:

print("__init__ method called..")

else:

print("Instance already created:", self.getInstance())

@classmethod

def getInstance(cls):

if not cls.__instance:

cls.__instance = Singleton()

return cls.__instance

s1 = Singleton() # 输出 '__init__ method called..'

s2 = Singleton() # 输出 'Instance already created: <__main__.Singleton object at 0x7f88ae3e2c50>'

s3 = Singleton.getInstance() # 输出 'Instance already created: <__main__.Singleton object at 0x7f88ae3e2c50>'

```

2. 线程安全的懒加载方式

上面的示例代码可能存在线程安全的问题,因为多个线程在第一次访问时会同时调用`__init__()`方法,从而创建多个实例。为了确保线程安全,我们可以使用锁来同步访问。以下是一个简单的线程安全的单例模式实例代码:

```python

import threading

class Singleton:

__instance = None

__lock = threading.Lock()

def __init__(self):

if not Singleton.__instance:

print("__init__ method called..")

else:

print("Instance already created:", self.getInstance())

@classmethod

def getInstance(cls):

if not cls.__instance:

with cls.__lock:

if not cls.__instance:

cls.__instance = Singleton()

return cls.__instance

```

3. 饿汉式实现

饿汉式是另一种单例模式的实现方式。这种方式会在程序启动时就创建实例,并使用一个私有变量存储实例。以下是一个基于饿汉式的单例模式实例的示例代码:

```python

class Singleton:

__instance = Singleton()

def __init__(self):

if not Singleton.__instance:

print("__init__ method called..")

else:

print("Instance already created:", self.getInstance())

@classmethod

def getInstance(cls):

return cls.__instance

s1 = Singleton() # 输出 '__init__ method called..'

s2 = Singleton() # 输出 'Instance already created: <__main__.Singleton object at 0x7f88ae3e2c50>'

s3 = Singleton.getInstance() # 输出 'Instance already created: <__main__.Singleton object at 0x7f88ae3e2c50>'

```

4. 序列化和反序列化

如果单例类需要实现序列化和反序列化,我们需要在类定义中添加`__getstate__()`和`__setstate__()`方法。以下是一个带序列化和反序列化的单例模式实例的示例代码:

```python

import pickle

class Singleton:

__instance = None

def __new__(cls):

if not cls.__instance:

cls.__instance = super().__new__(cls)

return cls.__instance

def __init__(self):

if not Singleton.__instance:

print("__init__ method called..")

else:

print("Instance already created:", self.getInstance())

def getInstance(cls):

if not cls.__instance:

cls.__instance = Singleton()

return cls.__instance

def __getstate__(self):

return self.__dict__

def __setstate__(self, state):

self.__dict__ = state

s1 = Singleton()

serialized_data = pickle.dumps(s1)

s2 = pickle.loads(serialized_data)

print(s1)

print(s2)

```

5. 使用场景

单例模式通常用于需要对共享资源进行集中控制的场景,例如:数据库连接池、线程池、打印任务队列等。通过使用单例模式,我们可以确保在任何时候都只有一个实例在运行。此外,在全局共享某个对象时,单例模式通常是最佳选择。

综上所述,本文分析了单例模式的实例化方法和使用场景。我们可以使用懒加载方式、线程安全的懒加载方式、饿汉式实现等方式来创建单例模式,并通过序列化和反序列化实现其持久化。在实际应用中,单例模式通常用于需要对共享资源进行集中控制的场景,并且其提供了一个全局访问点,方便我们在任何时候都能使用该对象。

备考资料 免费领取:软件设计师报考指南+考情分析+思维导图等 立即下载
真题演练 精准解析历年真题,助你高效备考! 立即做题
相关阅读
软件设计师题库