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>
    此时你会发现,创建俩个对象,只输出了一个初始化内容
    
    
    
     
     
  • 相关阅读:
    随机数生成程序代码( 伪随机<stdlib.h> )
    C++的学习 (此博客将一直补充更新下去,C++语法方面的内容不开新随笔了, *【语法学习】)
    sdut oj 1510 Contest02-4 Spiral
    POJ 2017 Speed Limit (直叙式的简单模拟 编程题目 动态属性很少,难度小)
    JavaWeb-入门第一课-1.静态web动态web 2.web服务器 3.下载和安装Tomcat-web服务器
    java小知识,驼峰规则
    亚马逊 协同过滤算法 Collaborative filtering
    第一个JSP程序
    物理学步入禅境:缘起性空
    人既然知道努力就可以进步,为什么还是会不努力?
  • 原文地址:https://www.cnblogs.com/lz-tester/p/9273164.html
Copyright © 2011-2022 走看看