zoukankan      html  css  js  c++  java
  • 单态模式

    # ### 单态模式 
    '''无论实例化多少次,都有且只有一个对象.'''
    '''最终目的:为了节省内存空间.应用的场景是只调用相关的成员属性或方法,而不用动态添加成员属性方法的环境中'''
    
    """
    __obj 变成私有,控制不让用户在类外直接获取obj,而是用__new__来控制返回的逻辑
    先判断cls.__obj 是不是None
    如果是None,代表是一个空的对象,那么就利用父类的__new__方法来创建对象
    如果不是一个空对象,代表先前早已实例化过了一个对象
    就把这个对象给他返回
    """
    # (1) 基本用法
    class Singleton():
    	__obj = None
    	def __new__(cls):
    		if cls.__obj is None:
    			# 借助父类创建对象
    			obj = object.__new__(cls)
    			# 把这个对象赋值给类中成员属性__obj
    			cls.__obj = obj
    		return cls.__obj
    
    # 第一次创建时,因为cls.__obj 是None 所以创建一个对象
    obj = Singleton()
    print(obj)
    # 第二次实例化时,因为cls.__obj 不是None ,直接返回上一次创建的那个对象
    obj = Singleton()
    print(obj)
    # 第三次实例化时,同第二次
    obj = Singleton()
    print(obj)
    obj = Singleton()
    print(obj)
    obj = Singleton()
    print(obj)
    
    # (2) 改造
    class Singleton():
    	__obj = None
    	def __new__(cls,*args,**kwargs):
    		if cls.__obj is None:
    			cls.__obj = object.__new__(cls)
    		return cls.__obj 
    		
    	def __init__(self,name):
    		self.name = name
    		
    obj1 = Singleton("王波")
    
    obj2 = Singleton("方真强")
    print(obj1.name)
    print(obj2.name)
    
    
    """
    第一次是创建对象,并且通过init初始化对象,为该对象赋值成员属性name
    self.name = 王波
    
    第二次是直接返回上一个对象,然后对他进行初始化,为该对象赋值成员属性name
    self.name = 方真强
    
    两个不同的变量名指向的是同一个对象
    而此时该对象的成员属性name 这个值是方真强
    print(obj1.name)
    print(obj2.name)
    打印的都是方真强
    """
    

      

  • 相关阅读:
    1、vsCode插件开发流程入门
    node中MySQL的安装与使用
    sublime使用插件
    Node.js基础知识梳理
    第5章-11 字典合并 (40分)
    我的考研心得-zju-se
    解决 重启tomcat上传的文件被自动删除或未重启过段时间也自动删除(deloy path)
    org.hibernate.InstantiationException: No default constructor for entity
    UE.delEditor is not a function问题原因及解决方法
    javaweb开发过程中遇到的问题
  • 原文地址:https://www.cnblogs.com/huangjiangyong/p/10920634.html
Copyright © 2011-2022 走看看