七面向对象之单例设计模式

Posted lz-tester

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了七面向对象之单例设计模式相关的知识,希望对你有一定的参考价值。

一、"""单例设计模式:通俗的讲就是单个实例对象
设计模式:前人在工作中,为了做需求写代码积累的一种代码设计思想,我们根据套路来就行了
>>>>>>>
之前讲过的创建类实例对象,工作原理是这样的---调用类创建对象,解释器会自动调用__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>
此时你会发现,创建俩个对象,只输出了一个初始化内容

 

 

 

 

















以上是关于七面向对象之单例设计模式的主要内容,如果未能解决你的问题,请参考以下文章

PHP之单例模式

Python面向对象之单例模式

python面向对象之单例模式

《设计模式:可复用面向对象软件的基础》之单例模式

面向对象之单例模式

23面向对象的设计模式之单例模式--基础引入