• 单例模式的三种实现方式


    1、什么是单例模式

      单例模式:基于某种方法实列化多次得到的实例是同一个

    2、为何用单例模式

      当实例化多次得到的对象中存放的属性都一样的情况下,应该将多个对象指向同一个内存,即同一个实例(实例化同样的对象,通过单例模式,可以降低内存的暂用)

    3、如何用

      方式一、

    import setting
    class Mysql:
        __instacne=None
        def __init__(self,ip,port):
            self.ip=ip
            self.port=port
    
        @classmethod
        def from_conf(cls):#利用判断的模式可以将相同内容的ID指向同一个内存,从而减少内存空间
            if cls.__instacne is None:
                cls.__instacne=cls(setting.IP,setting.PORT)#必须要赋值
            return cls.__instacne#return 在if处表示不管__instacne是否是None都能调用
        def co(self):
            print("IP:%s PORT:%s" %(self.ip,self.port))
    
    obj1=Mysql.from_conf()
    obj2=Mysql.from_conf()
    obj3=Mysql.from_conf()
    
    print(obj1)
    print(obj2)
    print(obj3)
    obj4=Mysql("10.10.10.10",3307)
    print(obj4)
    
    obj1.co()
    def singleten(cls):#cls=Mysql
        _instance=cls(setting.IP,setting.PORT)
        def wrapper(*args,**kwargs):#Mysql()重复调用wrapper
            if len(args)==0 and len(kwargs)==0:
                return _instance#在没有传参的情况下,一直是使用默认的内存空间内的内容
            return cls(*args,**kwargs)#在传参的情况下就直接全部返回给类
        return wrapper
    @singleten
    class Mysql:
        def __init__(self,ip,port):
            self.ip=ip
            self.port=port
    obj=Mysql()#Mysql的调用是一直是wrapper()
    obj2=Mysql()
    print(obj is obj1)
    obj2=Mysql("1.1.12.3",3309)
    print(obj2)
    方式二
    class Mymeta(type):
        def __init__(self,class_name,class_bases,class_dic):
            super(Mymeta,self).__init__(class_name,class_bases,class_dic)
            self.__instance=self.__new__(self)
            self.__init__(self.__instance,setting.IP,setting.PORT)
        def __call__(self,*args,**kwargs):
            if len(args)==0 and len(kwargs)==0:
                return self.__instance
    
            obj = self.__new__(self)
            self.__init__(obj,*args,**kwargs)
            return obj
    
    class Mysql(object,metaclass=Mymeta):
        def __init__(self,ip,port):
            self.ip=ip
            self.port=port
    方式三
  • 相关阅读:
    HttpEntity转换Inputstream(红色)加XmlPull解析
    ImageLoader加载图片
    HttpClient——Get,Post
    Android例子源码非第三方实现根据字母排序的城市列表
    Android 仿QQ消息界面
    css折叠表格
    前端页面文字长度显示控制
    (首页上一页下一页尾页 + 下拉框跳转)分页功能
    基于bootstrap的分页插件
    HTML 禁止复制文字
  • 原文地址:https://www.cnblogs.com/yf18767106368/p/9254382.html
Copyright © 2020-2023  润新知