单例模式的python实现

2019/03/16 18:37
阅读数 26
# 本实例主要介绍单例模式
# 1.什么是单例模式
  # 1. 确保有且只有一个对象被创建
  # 2. 为对象提供一个访问点,以使程序可以全局访问该对象
  # 3. 控制共享资源的并行访问

# 2.单例模式实例
class Singleton(object):
	def __new__(cls):
		if not hasattr(cls, 'instance'):
			cls.instance = super(Singleton, cls).__new__(cls)
		return cls.instance

s = Singleton()
print("Object created",s)
s1 = Singleton()
print("Object created",s1)

		
		
# 3.单例设计模式中的懒汉式实例化
class Singleton1:
	__instance = None
	def __init__(self):
		if not Singleton1.__instance:
			print("__init__ method called")
		else:
			print("Instance already created", self.getInstance())
	
	@classmethod
	def getInstance(cls):
		if not cls.__instance:
			cls.__instance = Singleton1()
		return cls.__instance

s = Singleton1()
print("Object created", Singleton1.getInstance())
s1 = Singleton1()

	
# 4.Monostate(Borg) 单态模式
# 所有对象共享相同状态,改变一个实例的状态,另一个实例也会改变
class Borg:
	__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)
print("Borg object b1", b1)
print("Object state b", b.__dict__)
print("Object state b1", b1.__dict__)

# 基于__new__方法本身实现Borg
class BorgNew:
	__shared_state = {}
	def __new__(cls, *args, **kwargs):
		obj = super(BorgNew , cls).__new__(cls, *args, **kwargs)
		obj.__dict__ = cls.__shared_state
		return obj

b = BorgNew()
b1 = BorgNew()
b.x = 4

print("Borg object b", b)
print("Borg object b1", b1)
print("Object state b", b.__dict__)
print("Object state b1", b1.__dict__)
		
	
# 5.单例和元类
# 元类: 元类是一个类的类,这意味着该类是它元类的一个实例
class MyInt(type):
	def __call__(cls, *args, **kwargs):
		print("******Here is MyInt******",args)
		print("How do whatever you want with these objects...")
		return type.__call__(cls, *args, **kwargs)

class int(metaclass=MyInt):
	def __init__(self, x, y):
		self.x = x
		self.y = y

i = int(4, 5)

# 基于元类的单例实现
class MetaSingleton(type):
	_instances = {}
	def __call__(cls, *args, **kwargs):
		if cls not in cls._instances:
			cls._instances[cls] = super(MetaSingleton, cls).__call__(*args, **kwargs)
		return cls._instances[cls]

class Logger(metaclass=MetaSingleton):
	pass

logger1 = Logger()
logger2 = Logger()
print(logger1, logger2)
	

# 6.单例模式的应用		
# A. 数据库的操作
import sqlite3
class MetaSingleton(type):
	_instances = {}
	def __call__(cls, *args, **kwargs):
		if cls not in cls._instances:
			cls._instances[cls] = super(MetaSingleton, cls).__call__(*args, **kwargs)
		return cls._instances[cls]

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 objcursor db1", db1)
print("Database objcursor db2", db2)

# 单一的应用可以使用该方法,节约CPU,内存等资源
# 集群化应用, 就需要使用数据库连接池
	
# B.监控服务
class HealthCheck:
	_instances = None
	def __new__(cls, *args, **kwargs):
		if not HealthCheck._instances:
			HealthCheck._instances = super(HealthCheck, cls).__new__(cls, *args, **kwargs)
		return HealthCheck._instances
	
	def __init__(self):
		self._servers = []
	
	def addServer(self):
		self._servers.append("server1")
		self._servers.append("server2")
		self._servers.append("server3")
		self._servers.append("server4")
	
	def changeServer(self):
		self._servers.pop()
		self._servers.append("server5")

hc1 = HealthCheck()
hc2 = HealthCheck()
print(hc1,hc2)

hc1.addServer()
for i in range(4):
	print("checking ", hc1._servers[i])

hc2.changeServer()
for i in range(4):
	print("checking ", hc2._servers[i])
		
						
# 7.单例模式的优缺点
# 优点: 1. 创建有且只有一个对象, 2.节省CPU,内存资源.
# 缺点: 1. 全局变量被误改, 但是别的对象还在引用 2.同一个对象,创建多个引用 3.可能影响其他类

  

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部