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)
    打印的都是方真强
    """
    

      

  • 相关阅读:
    UVALive 5983 MAGRID DP
    2015暑假训练(UVALive 5983
    poj 1426 Find The Multiple (BFS)
    poj 3126 Prime Path (BFS)
    poj 2251 Dungeon Master 3维bfs(水水)
    poj 3278 catch that cow BFS(基础水)
    poj3083 Children of the Candy Corn BFS&&DFS
    BZOJ1878: [SDOI2009]HH的项链 (离线查询+树状数组)
    洛谷P3178 [HAOI2015]树上操作(dfs序+线段树)
    洛谷P3065 [USACO12DEC]第一!First!(Trie树+拓扑排序)
  • 原文地址:https://www.cnblogs.com/huangjiangyong/p/10920634.html
Copyright © 2011-2022 走看看