Home > php教程 > php手册 > 深入理解PHP中的单例模式(附代码)

深入理解PHP中的单例模式(附代码)

PHPz
Release: 2018-10-22 16:39:42
forward
1119 people have browsed it

单例模式,是一种常用的软件设计模式,在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例,即一个类只有一个对象实例。通俗来讲就是通过提供自身共享实例的访问,单例设计模式用于限制特定对象只能被创建一次,来看下这个单例模式的要点:

1.一个类只能有一个对象;

2.必须是自行创建这个类的对象;

3,要想整个系统提供这一个对象;

从具体实现的角度来说,可以按着下面这三点来理解:

一是单例模式的类只提供私有的构造函数,

二是类定义中含有一个该类的静态私有对象,

三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。

最主要的就是还要有一个private的clone方法,防止克隆,得记得哈。

优点如下:

一、实例控制

单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。

二、灵活性

因为类控制了实例化过程,所以类可以灵活更改实例化过程。

缺点如下:

一、开销

虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。

二、可能的开发混淆

使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。

三、对象生存期

不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用。

来看下咱写的案例 :

class Test{

    static private $instance;
    private $age;
    private $name;

    private function __construct($name,$age)
    {
        $this->name = $name;
        $this->age = $age;
        echo "construct".PHP_EOL;
    }

    private function __clone()
    {
        // TODO: Implement __clone() method.
    }

    static public function set_name($name,$age)
    {
        if (!self::$instance instanceof self) {
             self::$instance = new self($name,$age);
         }
         return self::$instance;
    }

    public function get_name()
    {
        echo $this -> name.PHP_EOL;
        echo $this -> age.PHP_EOL;
    }

}

$object_1 = Test::set_name("cuijinpeng","26");
$object_1->get_name();
echo "<br>";
$object_2 = Test::set_name("luyaran","27");
$object_2->get_name();
Copy after login

从上述实例中,我们可以看出,$object_1创建对象后,参数是"cuijinpeng","26",但是$object_2并没有创建对象,而是直接使用$instance保存的唯一对象,所以输出的参数并没有变为"luyaran","27"。

好啦,本次记录就到这里了。

【相关教程推荐】

1. php编程从入门到精通全套视频教程
2. php从入门到精通 
3. bootstrap教程

Related labels:
source:csdn.net
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Issues
php data acquisition?
From 1970-01-01 08:00:00
0
0
0
PHP extension intl
From 1970-01-01 08:00:00
0
0
0
How to learn php well
From 1970-01-01 08:00:00
0
0
0
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template