• CSIC_716_20191129【 单例模式 的五种实现方式】


     单例模式

    单例模式:在确定类中的属性和方法不变时,需要反复调用该类的情况。  让所有通过该类实例化出的对象,都指向同一个内存地址。

    优点:节省内存空间。

    单例模式有五种表现形式:

    1.通过classmethod实现

    2.通过__new__实现

    3.通过导入模块时实现

    4.通过装饰器实现

    5.通过元类实现

    1.通过classmethod实现

    classmethod单例开辟的空间中,最新的内容是第一次被更新的。之后的对象统一以最初的为准

    class Sun:
        __instance = None
    
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port
    
        @classmethod
        def single(cls, ip, port):
            if not cls.__instance:
                cls.__instance = cls(ip, port)
    
            return cls.__instance
    
    
    obj1 = Sun.single('192.168.1.1', 9090)
    obj2 = Sun.single('127.0.0.1', 8080)
    obj3 = Sun.single('255.255.255.0', 7070)
    print(obj3.ip)  # 192.168.1.1
    print(obj2.ip)  # 192.168.1.1
    print(obj1.ip)  # 192.168.1.1
    

      

    2.通过__new__实现

     __new__单例开辟的空间中,最新的内容是最后一次被更新的。之前的对象统一以最新的为准.

    class Sun:
        __instance = None
    
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port
    
        def __new__(cls, *args, **kwargs):  # 此处传入的参数只和类相关,其他的。
            if not cls.__instance:
                cls.__instance = object.__new__(cls)
    
            return cls.__instance
    
    
    obj1 = Sun('192.168.1.1', 9090)
    obj2 = Sun('127.0.0.1', 8080)
    obj3 = Sun('255.255.255.0', 7070)
    print(obj3.ip)  # 255.255.255.0
    print(obj2.ip)  # 255.255.255.0
    print(obj1.ip)  # 255.255.255.0
    

     

    3.通过元类实现单例模式

    元类单例开辟的空间中,最新的内容是第一次被更新的。之后的对象统一以最初的为准

    # _*_ coding: gbk _*_
    # @Author: Wonder
    class Singleton(type):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)  # 继承
            self._instance = None  # 派生
    
        def __call__(self, *args, **kwargs):
            if not self._instance:
                self._instance = super().__call__(*args, **kwargs)
            return self._instance  # 调用就返回
    
    
    class MySQL(metaclass=Singleton):
        def __init__(self, host, port):
            self.host = host
            self.port = port
    
    
    obj1 = MySQL('192.168.1.1', 9090)
    obj2 = MySQL('127.0.0.1', 8080)
    obj3 = MySQL('255.255.255.0', 7070)
    print(obj1.host)  # 192.168.1.1
    print(obj2.host)  # 192.168.1.1
    print(obj3.host)  # 192.168.1.1
    

      

     

  • 相关阅读:
    JDK8 直接定义接口中静态方法
    Spring+Netty+WebSocket实例
    基于Maven,Spring+ActiveMQ实现,贴近实际
    Netty+WebSocket简单实现网页聊天
    ActiveMQ简单入门实例
    WCF 的日志配置
    AutoMapper使用笔记
    博客园现代化建设——AutoMapper
    jqplot formatString 日期格式化列表
    MongoDB实战开发 【零基础学习,附完整Asp.net示例】
  • 原文地址:https://www.cnblogs.com/csic716/p/11958418.html
Copyright © 2020-2023  润新知