首页 > 其他分享 >直播电商平台开发,设计模式单例模式

直播电商平台开发,设计模式单例模式

时间:2022-10-24 14:22:54浏览次数:76  
标签:__ 设计模式 s2 args instance 单例 ._ 电商 cls

直播电商平台开发,设计模式单例模式

1.说明

单例即只有一个实例,比如说配置、日志、连接池等,可以避免多个实例带来的多余的资源开销,并且在多线程环境下保证数据安全

 

2.类重写__new__

 

class Singleton:
    _instance = None
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, "_instance"):
            cls._instance = super().__new__(cls, *args, **args)
        return cls._instance
s1 = Singleton()
s2 = Singleton()
print(id(s1), id(s2), s1 is s2)

3.装饰器

我们可以使用functools里的wraps装饰一下,它能保留原有函数的名称和函数属性

 


from functools import wraps
def singleton(cls):
    instance = dict()
    @wraps(cls)
    def wrapper(*args, **kwargs):
        if cls not in instance:
            instance[cls] = cls(*args, **kwargs)
        return instance[cls]
    return wrapper
@singleton
class Person:
    pass
s1 = Person()
s2 = Person()
print(id(s1), id(s2), s1 is s2)

 

4.元类

type创建类时自动调用__init__(),类在创建对象时会自动调用__call__()

 


class SingletonMeta(type):
    def __init__(cls, *args, **kwargs):
        cls._instance = None
        super().__init__(*args, **kwargs)
    def __call__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super().__call__(*args, **kwargs)
        return cls._instance
class Person(metaclass=SingletonMeta):
    pass
s1 = Person()
s2 = Person()
print(id(s1), id(s2), s1 is s2)

 

5.加锁优化

如果不加锁,在多线程情况下可能会同时实例化对象

 


from threading import RLock
class Singleton:
    _instance = None
    _lock = RLock()
    def __new__(cls, *args, **kwargs):
        if cls._instance:
            return cls._instance
        with cls._lock:
            if not cls._instance:
                super().__new__(cls, *args, **kwargs)
            return cls._instance
s1 = Singleton()
s2 = Singleton()
print(id(s1), id(s2), s1 is s2)

 

以上就是 直播电商平台开发,设计模式单例模式,更多内容欢迎关注之后的文章

 

标签:__,设计模式,s2,args,instance,单例,._,电商,cls
From: https://www.cnblogs.com/yunbaomengnan/p/16821309.html

相关文章

  • 行为型设计模式之解释器模式
    解释器模式解释器模式属于行为型模式。它是指给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。是一种按照规定的语法(文法)进行......
  • 设计模式之原型模式
    概述在使用原型模式时,需要首先创建一个原型对象,再通过复制这个原型对象来创建更多同类型的对象。其定义如下:使用原型实例指定创建对象的种类,并且通过克隆这些原型创建新的......
  • 浅谈PHP设计模式的工厂模式
    简介工厂模式属于创建型模式,可以分为三种:简单工厂、工厂模式、抽象工厂。通俗讲就是用于如何优雅的创建对象而设计。当开发者不知道建什么对象,或者创建方式过于复杂的时......
  • [外卖电商]小程序的类目选择的注意事项
    最近接触了一个电商的项目,外卖点餐的平台开发,零售端使用小程序,门店端发布成App版本,在开发小程序的时候,遇到了一些类目权限上的问题,下面将问题及解决方案,一一做下解答。一......
  • 设计模式 - 桥接模式
    目录实例数据转换工具桥接模式概念角色定义典型代码具体实现总结源码实例数据转换工具Sunny软件公司欲开发一个数据转换工具,可以将数据库中的数据转换成多种文件格式,例......
  • 设计模式之抽象工厂模式
    简介工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会......
  • 模板方法设计模式
    模板方法设计模式什么是设计模式?某个问题的固定的解决方案。(可以被重复使用。)你知道哪些设计模式?GoF设计模式:通常我们所说的23种设计模式。(GangofFour:4人组提出的......
  • 一起学习 Go 语言设计模式之设计模式概述
    我的语言之局限,即我的世界之局限。——LudwigWittgenstein(1889-1951)设计模式的概念模式是在特定环境下人们解决某种重复出现问题的一套成功有效的解决方案。设计模式(Desi......
  • 双11的大型电商活动服务器崩溃是怎么回事?
    双11的大型电商活动服务器崩溃是怎么回事?​马上又要到淘宝双11了,你是不是也体验过在12点准点付款时网络造成的卡顿显示请稍后在尝试?有时候商家的礼品却只有前100名或500名......
  • 单例 Bean 的线程安全问题
    最近面试遇到一个问题:单例Bean的线程安全问题怎么解决的。之前了解但是没有深究它的解决方法。大部分时候我们并没有在项目中使用多线程,所以很少有人会关注这个问题。......