在使用到多个窗口时,往往需要进行窗口通讯,和窗口跳转,但是每次窗口跳转时都重新创建的话,一个是会不利于窗口通讯,再一个是不利于管控,这时我们可以将所有的窗口都由一个对象来进行创建,而且这个对象也只能被创建一次,也就是接下来所说的工厂单例(可以将窗口的创建理解为产品,而创建窗口的对象为工厂,只不过这个工厂是唯一的,而且这个工厂每种东西只生产一样)

工厂模式

 

实现代码如下:

#!/AME/OMOstep4/phtest  python
# _*_ conding:utf-8 _*_
# @TIME     : 2021-06-15 01:32
# @Author   : lizi
# @File     : factortest


from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import os
import sys

from enum import Enum#加载枚举模块

#测试加入的窗口模块
from widtest.qss1 import *

class wid_enum(Enum):
    LOGWID = 0
    REGWID = 1

#窗口工厂模式创建
class wid_factor(object):
    obj = None   #对象第一次为None
    def __new__(cls, *args, **kwargs):  # 单例模式
        if cls.obj is None:  # 如果对象为None
            cls.obj = super().__new__(cls)  # 就创建一个对象
        return cls.obj  # 否则直接返回
    def __init__(self):
        self.creat_wid()
    #创建窗口
    def creat_wid(self):
        self.qss1wid = logwidge() #此对象为已经创建好的窗口类
    #返回唯一窗口
    def getwid(self,type):
        print(type)
        if type == wid_enum.LOGWID:
            return self.qss1wid
    # @classmethod
    # def sigton(cls):
    #     if not cls.__instance:
    #         cls.__instance = cls()
    #     return cls.__instance





if __name__ == "__main__":
    app = QApplication(sys.argv)#创建一个应用程序
    widfactor = wid_factor()
    widfactor2 = wid_factor()
    
    #测试工厂是否只有一个
    print(id(widfactor))
    print(id(widfactor2))
    #测试工厂生产的产品是否唯一
    print(id(widfactor.getwid(wid_enum.LOGWID)))
    print(id(widfactor2.getwid(wid_enum.LOGWID)))

    sys.exit(app.exec())#开始执行应用程序,并进入消息循环,调用程序并转移进程





实现效果

测试发现工厂和产品的创建都是唯一的,所以此时的工厂单例模式完成

 

 

总结:python的单例框架

#基本创建
class singleton_object(object):
    obj = None   #对象第一次为None
    def __new__(cls, *args, **kwargs):  # 单例模式
        if cls.obj is None:  # 如果对象为None
            cls.obj = super().__new__(cls)  # 就创建一个对象
        return cls.obj  # 否则直接返回
    def __init__(self):
        pass

#使用
sigle = singleton_object()



 

 

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐