1.设计模式和单例设计模式概念
在我们开始学习软件开发之前,已经有无数的前辈们投入到这项事业, 前辈啊,在工作中就是来编写代码,解决一个又一个问题,然后呢,他们在针对自己曾经解决过的问题,进行不断的归纳和总结,先是对问题进行分类,然后再来确定一个成熟的解决方案,不同的问题提供不同的解决套路,这就叫做设计模式.
既然前辈们已经把解决问题的套路确定下来,那么我们只需要学习一下这个套路,在今后的工作中一旦遇到这一类问题,就可以使用对应的套路来解决问题.
这样在开发时,就可以不用再自己花费脑筋来思考这个问题应该怎么样解决, 这个就是学习设计模式的好处.
介绍一个单例设计模式,要想理解清楚单例设计模式的好处,先来看几个应用场景,那举了一个音乐播放的例子,举了一个回收站的例子,举了一个打印机的例子,这三个例子有一个共同特点,这三个对象都只有唯一的一个存在. 那单例设计模式,所谓单例啊,就是单个实例, 当定义完成一个类之后,使用类名加括号的方式可以创建一个对象,而单例设计模式解决的问题呢,就是无论执行多少次类名加括号, 返回的对象内存地址永远都是相同的,
如果返回的内存地址是相同的,说明利类名加括号创建出来的对象, 在内存中永远只有唯一的一个实例,这个就叫做单例设计模式.
一句话讲设计模式就是前人总结出来的套路,碰到不同的问题,使用不同的套路就可以了,而不需要我们再自己开动脑筋来思考这个问题应该怎么解决,这个就叫做设计模式。而单例设计模式要解决的问题就是, 使用类创建的对象在系统中永远只有唯一的一个实例,这个就是单例设计模式在开发中能够解决的问题.
2.new方法的作用
以两个下划线开头, 两个下划线结尾的方法是一个内置方法,而__new__方法呢是由object这个基类提供了一个内置的静态方法,这个方法的作用是 ,当使用一个类名创建对象的时候,Python解释器会帮做两件事情,第1件事情为对象在内存分配空间,第2件事情为对象进行初始化,初始化方法已经学习过了, 那为对象分配空间就是__new__方法.
单例设计模式的目的就是为对象在内存分配空间的时候,永远只会返回一个唯一的固定的内存空间,这样就能够保证在内存中这个类的对象只有唯一的一份,这个就叫做单例,而要想达到这个效果,就需要了解一下,为对象分配空间的__new__方法,明确了目的之后,接下来看一下,在__new__方法内部都做哪些事情,__new__方法主要做两件事情,第1件事情呢在内存中为对象分配空间, 分配了空间之后, 注意__new__方法是有返回值的, __new__方法呢,需要把对象的引用作为返回值, 返回给Python解释器。
当Python解释器拿到了对象的引用之后,就会把对象的引用传递到初始化方法的第1个参数,
初始化方法拿到了对象引用之后,就可以在方法的内部, 针对对象来定义实例属性了,这个就是__new__方法和初始化方法的分工. 一句话讲__new__方法负责给对象分配空间,而初始化方法负责给对象初始化.
一句话讲__new__方法是由object这个基类提供了一个内置的静态方法, __new__方法的作用,有两个,第一个为对象在内存分配空间,第二个把分配空间的内存地址直接返回给python的解释器, python的解释器拿到对象引用之后, 就可以把这个引用传递到初始化方法内部,
由初始化方法对传递进来的对象进行初始化,而之所以要学习__new__方法,就是因为需要对分配空间的方法进行改造,改造的目的呢,就是当使用类名创建对象的时候,无论执行多少次,在内存中永远只会创建出一个对象的实例,这样就可以达到单例设计模式的目的了.
3. 重写new方法
对__new__方法方法的重写做一个演练, 先来定义 MusicPlayer类, 然后再MusicPlayer类的内部重写一下由object 基类提供的__new__方法, 通过对这个方法的重写, 来强化一下__new__方法要做的事情, 第一件事情, 再内存中为对象分配空间, 第二件事情, 返回对象的引用, 同时还需要验证一下,当使用类名创建对象的时候,Python解释器会自动调用__new__方法.
针对__new__方法的重写,做一个演练,先来定一个先来定义 MusicPlayer 音乐播放器的类,然后呢,在音乐播放器先来定义 MusicPlayer类的内部, 重写一下由object基类提供的__new__方法. 通过对这个方法的重写,共同来强化一下__new__方法要做的两件事情,第一件事情在内存中为对象分配空间,第二件事情返回对象的引用.
同时还需要验证一下,当使用类名创建对象的时候,Python的解释器会自动帮我们调用__new__方法. 目的明确之后,首先使用class关键字来定义一个MusicPlayer 的类,让这个类啊,继承自object基类。类名准备完成,先使用def关键字,找到初始化方法,先在初始化方法内部做一个输出, 播放器初始化,只需要做一个简单的输出就可以.
现在一个简单的音乐播放器类已经准备完成,就可以在主程序中来创建一个播放器对象.
写一下创建播放器对象,要创建对象,就先给对象起个名字,叫做player,然后使用MusicPlayer创建一个对象.
现在就在主程序中使用print函数, 把player这个对象做一个输出,
运行一下程序,控制台输出了播放器初始化,同时把对象的内存地址也做了一个输出。