zoukankan      html  css  js  c++  java
  • 七、面向对象之单例设计模式

    一、"""单例设计模式:通俗的讲就是单个实例对象
    设计模式:前人在工作中,为了做需求写代码积累的一种代码设计思想,我们根据套路来就行了
    >>>>>>>
    之前讲过的创建类实例对象,工作原理是这样的---调用类创建对象,解释器会自动调用__new__这个内置的静态方法为对象分配内存空间
    ,然后返回这个对象,再将这个对象的引用传给__init__初始化方法进行初始化。这是工作原理,但是在创建多个对象时,给对象分配
    内存空间的内存地址是不一样的,也就是多个实例,接下来单例就是要将创建多个对象时,分配的内存空间的内存地址始终是唯一一个,这就叫单例
    """
    这幅图是描述调用类创建对象时的工作原理:
    实现单例的代码:
    class Person(object):
        instance_neicun = None  # 用类属性记录创建对象时的内存地址
    
        def __new__(cls, *args, **kwargs):  # 重写new方法
            if cls.instance_neicun is None:
                 cls.instance_neicun = super().__new__(cls)  # 用一个变量接收object类中new方法返回的内存地址,new是一个特殊的静态
                                                               #方法,调用时需要传递cls参数
    
            return cls.instance_neicun  # new方法需要返回一个对象,
    
        def __init__(self):
            print('初始化开始...')
    
    a = Person()
    print(a)
    b = Person()
    print(b)

    输出结果:
    初始化开始...
    <单例设计模式.Person object at 0x0000000001730748>
    初始化开始...
    <单例设计模式.Person object at 0x0000000001730748>
    此时你会发现,我创建俩个对象时,内存地址都是一样的!
    
    
    
    二、上面的代码你会发现,初始化内容每调用一次就会输出一次,那么如果只要输出一次怎么做呢?只需要将上述代码做一点修改就可以了
    class Person(object):
        instance_neicun = None  # 用类属性记录创建对象时的内存地址
        instance_flag = False  # 是否执行过初始化方法的标记
    
        def __new__(cls, *args, **kwargs):  # 重写new方法
            if cls.instance_neicun is None:
                 cls.instance_neicun = super().__new__(cls)  # 用一个变量接收object类中new方法返回的内存地址,new是一个特殊的静态
                                                               #方法,调用时需要传递cls参数
    
            return cls.instance_neicun  # new方法需要返回一个对象,
    
        def __init__(self):
            # 判断如果初始化方法被调用过一次,就直接返回
            if Person.instance_flag is True:
                return
            # 如果没有调用过,就进行初始化
            print('初始化开始...')
            # 修改标记
            Person.instance_flag = True
            
            
    a = Person()
    print(a)
    b = Person()
    print(b)

    输出结果:
    初始化开始...
    <单例设计模式.Person object at 0x000000000170F668>
    <单例设计模式.Person object at 0x000000000170F668>
    此时你会发现,创建俩个对象,只输出了一个初始化内容
    
    
    
     
     
  • 相关阅读:
    HDU 1698 Just a Hook (线段树模板题-区间求和)
    spring定时任务详解(@Scheduled注解)
    spring定时任务(@Scheduled注解)
    java反射实现接口重试
    微信开发者工具在线调试
    消息队列应用场景
    Redis、Memcache和MongoDB的区别
    下拉框多选实现回显及sql
    MySQL 中 You can't specify target table '表名' for update in FROM clause错误解决办法
    catch异常
  • 原文地址:https://www.cnblogs.com/lz-tester/p/9273164.html
Copyright © 2011-2022 走看看