理解单例设计模式
只允许Singleton类生成一个实例。
如果已经有一个实例了,我们会重复提供同一个对象
class Singleton(object):
def __new__(self):
if not hasattr(self, 'instance'):
self.instance = super(Singleton, self).__new__(self)
return self.instance
s = Singleton()
print("Object created ", s)
s1 = Singleton()
print("Object created ", s1)

懒汉式实例化
例如在导入模块的时候,我们可能会无意中创建一个对象,但当时根本用不到它。
懒汉式实例化能够确保在实际需要时寻创建对象。
所以,懒汉式实例化是一种节约资源并仅在需要时才创建它们的方式。
class Singleton(object):
__instance = None
def __init__(self):
if not Singleton.__instance:
print("__init__method called..")
else:
print("Instance already created: ", self.getInstance())
@classmethod
def getInstance(self):
if not self.__instance:
self.__instance = Singleton()
return self.__instance
s = Singleton() # 类已初始化,但未创建对象
print("Object created ", Singleton.getInstance()) # 在这里创建
s1 = Singleton() # 实例已创建

Monostate单(态)例模式(1)
class Borg(object):
__shared_state = {"1":"2"}
def __init__(self):
self.x = 1
self.__dict__ = self.__shared_state
pass
b = Borg()
b1 = Borg()
b.x = 4
print("Borg Object 'b': ", b) ## b和b1是不同的对象
print("Borg Object 'b1': ", b1)
print("Object State 'b': ", b.__dict__) ## b和b1处于相同状态
print("Object State 'b1': ", b1.__dict__)

Monostate单(态)例模式(2)
class Borg(object):
_shared_state = {"1":"2"}
def __new__(self, *args, **kwargs):
obj = super(Borg, self).__new__(self, *args, **kwargs)
obj.__dict__ = self._shared_state
return obj
b = Borg()
b1 = Borg()
print("Borg Object 'b': ", b) ## b和b1是不同的对象
print("Borg Object 'b1': ", b1)
print("Object State 'b': ", b.__dict__) ## b和b1处于相同状态
print("Object State 'b1': ", b1.__dict__)

单例和元类(1)
class MyInt(type):
def __call__(self, *args, **kwds):
print("***** Here's My int *****", args)
print("Now do whatever you want with these objects...")
return type.__call__(self, *args, **kwds)
class int(metaclass=MyInt):
def __init__(self, x, y):
self.x = x
self.y = y
i = int(4, 5)

单例和元类(2)
class MetaSingleton(type):
_instances = {}
def __call__(self, *args, **kwargs):
if self not in self._instances:
self._instances[self] = super(MetaSingleton, self).__call__(*args, **kwargs)
return self._instances[self]
class Logger(metaclass=MetaSingleton):
pass
logger1 = Logger()
logger2 = Logger()
print(logger1)
print(logger2)

单例模式 I
import sqlite3
class MetaSingleton(type):
_instances = {}
def __call__(self, *args, **kwargs):
if self not in self._instances:
self._instances[self] = super(MetaSingleton, self).__call__(*args, **kwargs)
return self._instances[self]
class Database(metaclass=MetaSingleton):
connection = None
def connect(self):
if self.connection is None:
self.connection = sqlite3.connect("db.sqlite3")
self.cursorobj = self.connection.cursor()
return self.cursorobj
db1 = Database().connect()
db2 = Database().connect()
print("Database Objects DB1", db1)
print("Database Objects DB2", db2)

单例模式 II
class HealthCheck(object):
_instance = None
def __new__(self, *args, **kwargs):
if not HealthCheck._instance:
HealthCheck._instance = super(HealthCheck, self).__new__(self, *args, **kwargs)
return HealthCheck._instance
def __init__(self):
self._servers = []
def addServer(self):
self._servers.append("Server 1")
self._servers.append("Server 2")
self._servers.append("Server 3")
self._servers.append("Server 4")
def changeServer(self):
self._servers.pop()
self._servers.append("Server 5")
hc1 = HealthCheck()
hc2 = HealthCheck()
hc1.addServer()
print("Schedule health check for servers (1)..")
for i in range(4):
print("Checking ", hc1._servers[i])
hc2.changeServer()
print("Schedule health check for servers (2)..")
for i in range(4):
print("Checking ", hc2._servers[i])
