如何提升网站的权重,怎么下载网站动态图片,网站制作(信科网络),小型生鲜超市店面设计文章目录 前言一、单例模式二、单例模式实现方式三、单例模式示例四、单例模式在Django框架的应用 前言
GOF设计模式分三大类#xff1a;
创建型模式#xff1a;关注对象的创建过程#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模… 文章目录 前言一、单例模式二、单例模式实现方式三、单例模式示例四、单例模式在Django框架的应用 前言
GOF设计模式分三大类
创建型模式关注对象的创建过程包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式关注类和对象之间的组合包括适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。行为型模式关注对象之间的交互包括职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。
一、单例模式
单例模式Singleton Pattern 定义确保某一个类只有一个实例而且自行实例化并向整个系统提供这个实例这个类称为单例类它提供全局访问的方法。 解决问题如何确保系统中一个类只能有一个实例 使用场景 当系统中需要一个类来控制资源的访问确保资源不会因为多个实例的创建而产生冲突时。当整个系统的配置信息存放在一个对象中并由一个实例来进行管理时。当需要限制一个类的实例只能有一个比如数据库连接池、线程池、缓存等。 优点 单例模式提供了对唯一实例的受控访问。也可以特定数量的实例。由于在系统内存中只存在一个对象因此可以节约系统资源。 缺点 单例类较难扩展单例类的职责过重如果运行环境提供了自动垃圾回收技术可能被回收销毁 二、单例模式实现方式
方式一懒汉式线程不安全
使用类变量和类方法实现单例模式。get_instance()类方法负责创建和返回类的唯一实例。在第一次调用get_instance()方法时实例化在类加载时并不自行实例化这种技术又称为延迟加载Lazy Load技术即需要的时候再加载实例。在多线程环境下可能会有问题
class TaskManager:tm: TaskManager Nonedef __init__(self):passclassmethoddef get_instance(cls):if cls.tm is None:cls.tm TaskManager() # 自行实例化return cls.tm# 使用单例
task_manager TaskManager.get_instance()方寸二懒汉式线程安全
上述方式一可能会遇到线程安全问题。即如果有两个线程同时检查到 cls.tm 为 None 并尝试创建一个新的 TaskManager 实例这就会导致创建了多个实例。还需要待进一步确认。因为在Python中由于全局解释器锁Global Interpreter LockGIL的存在即使是多线程程序在任何给定时刻也只能有一个线程执行Python字节码。增加线程锁定保证线程安装但会影响性能
import threadingclass TaskManager:tm: TaskManager Nonelock threading.Lock()def __init__(self):passclassmethoddef get_instance(cls):with cls.lock: # 进行线程锁定if cls.tm is None:cls.tm TaskManager()return cls.tm# 使用单例
task_manager TaskManager.get_instance()方式三Python模块级别的变量
使用模块实现单例模式。Python的模块本身就是单例的因为模块在第一次导入时会被加载并创建之后的导入操作只是引用第一次创建的模块对象。config是一个模块级别的变量它在模块第一次被导入时创建之后的导入操作都会使用这个已经创建的实例。
# 模块 my_config.py
class Config:def __init__(self):passconfig Config()# 在其他文件中使用
from my_config import config推荐方式三 方式二 方式一
三、单例模式示例
使用模块实现单例模式
将负载均衡器LoadBalancer设计为单例类其中包含一个存储服务器信息的集合每次随机选择一台服务器来响应客户端的请求
# 模块 balancer.py
import randomclass LoadBalancer:def __init__(self):self.server_list []def add_server(self, server_name: str):self.server_list.append(server_name)def remove_server(self, server_name: str):if server_name in self.server_list:self.server_list.remove(server_name)def get_server(self):return random.choice(self.server_list)load_balancer LoadBalancer()在其它文件中使用单例客户端测试代码
from balancer import load_balancerload_balancer.add_server(server 1)
load_balancer.add_server(server 2)
load_balancer.add_server(server 3)
load_balancer.add_server(server 4)for i in range(10):server load_balancer.get_server()print(f分发请求至服务器{server})### 输出结果
分发请求至服务器server 4
分发请求至服务器server 3
分发请求至服务器server 2
分发请求至服务器server 3
分发请求至服务器server 1四、单例模式在Django框架的应用
配置对象Settings
Django的配置对象是全局的整个项目只有一个settings实例这个实例包含了项目的所有配置信息。Django启动时加载配置文件并将其作为一个单例供整个系统使用。
# 模块 django/conf/__init__.py
...
settings LazySettings()# 在其他文件中使用
from django.conf import settingsif settings.DEBUG:# Do something...您正在阅读的是《设计模式Python版》专栏关注不迷路~