菜单

单例的二种完结格局

2019年5月10日 - 金沙编程资讯

1、单例格局介绍

  单例格局是设计方式中最简单易行的款型之壹。这一方式的目标是驱动类的叁个对象产生系统中的唯1实例。要兑现那或多或少,能够从客户端对其开始展览实例化发轫。因而供给用1种只同意生成对象类的独步一时实例的体制,“阻止”全体想要生成对象的访问。使用工厂方法来界定实例化进程。这些艺术应该是静态方法(类措施),因为让类的实例去变通另一个唯1实例毫无意义

金沙国际,  2、通过定制元类达成

HOST='1.1.1.1'
PORT=3306
class Mymeta(type):
    def __new__(self,name,bases,dic): #定义类Mysql时就触发

        # 事先先从配置文件中取配置来造一个Mysql的实例出来
        self.__instance = object.__new__(self)  # 产生对象
        self.__init__(self.__instance, settings.HOST, settings.PORT)  # 初始化对象
        # 上述两步可以合成下面一步
        # self.__instance=super().__call__(*args,**kwargs)


        super().__init__(name,bases,dic)

    def __call__(self, *args, **kwargs): #Mysql(...)时触发
        if args or kwargs: # args或kwargs内有值
            obj=object.__new__(self)
            self.__init__(obj,*args,**kwargs)
            return obj

        return self.__instance




class Mysql(metaclass=Mymeta):
    def __init__(self,host,port):
        self.host=host
        self.port=port



obj1=Mysql() # 没有传值则默认从配置文件中读配置来实例化,所有的实例应该指向一个内存地址
obj2=Mysql()
obj3=Mysql()

print(obj1 is obj2 is obj3)

obj4=Mysql('1.1.1.4',3307)

三、单例的三种完毕方式

  单例的贯彻情势多数,那本身只介绍三种

  3、通过定义装饰器完成

HOST='1.1.1.1'
PORT=3306
def singleton(cls): #cls=Mysql
    _instance=cls(settings.HOST,settings.PORT)

    def wrapper(*args,**kwargs):
        if args or kwargs:
            obj=cls(*args,**kwargs)
            return obj
        return _instance

    return wrapper


@singleton # Mysql=Singleton(Mysql)
class Mysql:
    def __init__(self,host,port):
        self.host=host
        self.port=port



obj1=Mysql()
obj2=Mysql()
obj3=Mysql()
print(obj1 is obj2 is obj3) #True

obj4=Mysql('1.1.1.3',3307)
obj5=Mysql('1.1.1.4',3308)
print(obj3 is obj4) #Fals

 

 

  

二、为何要用单例 

  在Computer种类中,须求管住的财富包括软件外部财富,譬喻每台计算机能够有诸多少个打字与印刷机,但不得不有二个Printer
Spooler,
以幸免五个打字与印刷作业并且输出到打印机中。每台Computer能够有多少传真卡,可是只应该有1个软件负担处理传真卡,以制止出现两份传真作业并且传到传真卡中的意况。每台Computer能够有几多通信端口,系统应该集中管理这个通讯端口,以幸免八个通讯端口还要被四个请求同时调用。

 

  须要管住的财富包括软件内部能源,举例,大大多的软件都有3个(以致多少个)属性(properties)文件存放系统安排。那样的系统应该由二个目的来保管3本质量文件。

 

  需求管理的软件内部能源也蕴涵诸如负担记录网站来访人数的部件,记录软件系统内部事件、出错音讯的预制构件,或是对系统的显示张开自己辩论的预制构件等。那些部件都必须集中管理,不可整出三头。

 

  那个能源管理器构件必须只有3个实例,那是以此;它们必须自行开首化,那是那3个;允许所有系统访问本身这是其三。由此,它们都满足单例形式的原则,是单例形式的施用。

  一、通过定义三个类的法子完毕

HOST='1.1.1.1'
PORT=3306
class Mysql:
    __instance=None
    def __init__(self,host,port):
        self.host=host
        self.port=port

    @classmethod
    def singleton(cls):
        if not cls.__instance:
            cls.__instance=cls(HOST,PORT)
        return cls.__instance


obj1=Mysql('1.1.1.2',3306)
obj2=Mysql('1.1.1.3',3307)
print(obj1 is obj2) #False

obj3=Mysql.singleton()
obj4=Mysql.singleton()
print(obj3 is obj4) 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图