龙空技术网

PHP进阶教程-设计模式之单例模式

IT不是挨踢 116

前言:

而今姐妹们对“php写一个单例模式”都比较重视,兄弟们都想要分析一些“php写一个单例模式”的相关内容。那么小编同时在网摘上汇集了一些有关“php写一个单例模式””的相关文章,希望我们能喜欢,大家一起来了解一下吧!

​单例模式,属于创建类型的一种常用的软件设计模式。

通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)

对外提供全局实例的访问入口,它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。

结构图

主要解决的问题

保证一个类仅有一个实例,并提供一个访问它的全局访问点。避免一个全局使用的类频繁地创建与销毁。

优缺点

优点

单例模式确保同一个进程中同一个对象只有一个实例,阻止其他对象直接new在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。避免对资源的多重占用(比如写文件操作)。

缺点

没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。注意:单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。单例类禁止被new,也禁止被clone实现思路1、创建一个类,提供一个私有属性用来存储当前类对象实例。2、把构造方法设置为私有。3、如果是php语言编写把 __clone 方法设置为私有(其他语言忽略)。4、提供一个获取对象方法,在方法里面判断私有属性是否已经实例化成功,如果没有则new,如果有则返回。

示例代码:

Sunny.php

class Sunny{    private static $instance = null;    private $name;​    private function __construct(){    }​    private function __clone(){    }​    public static function getInstance(){        if (self::$instance == null) {            self::$instance = new static();        }        return self::$instance;    }​    /**     * @return mixed     */    public function getName(){        return $this->name;    }​    /**     * @param mixed $name     */    public function setName($name): void{        $this->name = $name;    }}

代码调用:

$sunny = Sunny::getInstance();$sunny1 = Sunny::getInstance();$sunny->setName("sunny");echo $sunny->getName() . "\n";//输出sunnyecho $sunny1->getName()."\n";//输出sunnyvar_dump($sunny===$sunny1);//true

结果输出:

sunnysunnybool(true)

$sunny 的结果输出了 sunny ,$sunny1 并没有赋值但是也是得到了 sunny 结果,因为它们是同一个对象。

两个对象进行对比,它们也是等于 true 的,说明获取到的都是同一个对象。

如果觉得文章还不错,请把文章分享给更多的人学习,在文章中发现有误的地方也希望各位指出更正。现有误的地方也希望各位指出更正。

标签: #php写一个单例模式