设计模式之单例模式 浏览次数:252 日期:2020-07-13 13:48:00 ### 概念 单例模式,顾名思义就是只有一个实例。单例模式确保某一个类在代码运行过程中只存在一个实例,不能重复创建实例。 ### 优点 使用单例模式的好处很大,以数据库操作为例,若不采用单例模式,当程序中出现大量数据库操作时,每次都要执行new操作, 每次都会消耗大量的内存资源和系统资源,而且每次打开和关闭数据库连接都是对数据库的一种极大考验和浪费。使用了单例模式,只需要实例化一次,不需要每次都执行new操作,极大降低了资源的耗费。一句话,减少资源的消耗。 ### 要素 - 需要一个保存类的唯一实例的静态成员变量 - 构造函数和克隆函数必须声明为私有的,防止外部程序创建或复制实例副本。 - 必须提供一个访问这个实例的公共静态方法,从而返回唯一实例的一个引用 上面三条,简称**三私一公**:私有化静态属性,私有化构造方法,私有化克隆方法,公有化静态方法 ### 三私一公 面试过一些同行,问他们怎么实现一个单例模式,都会说三私一共,我再问能具体说下实现逻辑吗,有的说私有的属性,但是却忽略了静态修饰符。还有的人忽略了构造方法的私有性,我问他们那我new会怎么样,他们一时无法回答上来。 所谓三私一公,必须先声明一个静态私有属性:用来保存当前类的实例 - 为什么必须是静态的?因为静态成员属于类,并被类所有实例所共享,可以用该属性去判断类是否被实例化过 - 为什么必须是私有的?不允许外部直接访问,仅允许通过类方法控制方法,避免类外进行类以及属性信息修改 必须将构造方法修饰为private私有方法,因为new始终会返回一个类的新实例,如果不修饰为private,则无法避免用户不去new,也就无法实现单例 必须将\__clone魔术方法修饰成private,用来禁止克隆。因为对象之间进行克隆可生成不同的对象,而对象克隆时会自动调用类的\__conle方法,因此将克隆方法设置为private属性 ### 实现代码 综上我们可以实现一个基本的单例模式 ```php name = 'Json'; print_r($db); print_r($db1); ``` 输出 ```shell Database Object ( [name] => Json ) Database Object ( [name] => Json ) ``` 证明db1和db指向的是同一个对象,实现了单例 最后更新时间为: 8个月前 (2020-07-13 13:48:00)