学习笔记01--单例模式实例

1. 单例模式I

通过一个数据库应用程序来展示单例的应用。明显的是,跨不同服务的共享资源是数据库本身。

import sqlite3

class MetaSingleton(type):
    _instance = {}
    
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instance:
            cls._instance[cls] = super(MetaSingleton, cls).__call__(*args, **kwargs)
        return cls._instance[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 Objects DB1', db1)
print('Database Objects DB2', db2)
  1. 以MetaSingleton为名创建一个元类
  2. Database类由MetaSingleton类装饰后,其行为表现为单例。因此,当数据库类被实例化时,它只创建一个对象
  3. 因为只有一个对象,所以对数据库的调用是同步的。此外,还能够节约系统资源

如果我们要开发的不是单个Web应用程序,而是集群化的情形,即多个Web应用程序共享单个数据库。单例就会变得不太方便,因为每增加一个应用程序,就要新建一个单例,添加一个对象来查询数据库。这导致数据库操作无法同步,并消耗大量资源。这种情况下,数据库连接池比实现单例好得多

2. 单例模式II

全局维护一张可用服务器的列表,当添加或者删除服务器时,所有服务会使用修改后的服务器列表。

class HealthCheck:
    _instance = None
    
    def __new__(cls, *args, **kwargs):
        if not HealthCheck._instance:
            HealthCheck._instance = super(HealthCheck, cls).__new__(cls, *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')
        
if __name__ == '__main__':
    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])

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值