单例模式,就是指一个类只有一个对象实例。这样做的好处,可以防止频繁创建对象而造成资源浪费。
设计单例模式,需要注意以下几点:
- 一个类只能有一个对象;
- 必须是自行创建这个类的对象;
- 要向整个系统提供这一个对象;
封装单例模式的类时,需做到以点几点:
- 只提供私有的构造函数,
- 含有一个该类的静态私有对象,
- 提供一个静态的公有的函数用于创建或获取它本身的静态私有对象。
- 有一个private的clone方法,防止克隆;
说到底,设计单例模式,需要有静态成员。下面我们来看一个实例:
<?php
//单例
class Uni
{
//创建静态私有的变量保存该类对象
static private $instance;
//构造方法是私有,防止外部直接创建对象
private function __construct()
{
}
//防止克隆对象
private function __clone()
{
}
static public function getInstance()
{
//判断$instance是否是Uni的对象
//没有则创建
//注意instanceof的使用
if (!self::$instance instanceof self) {
self::$instance = new self(); //在类中实例化本类的对象,使用self
}
return self::$instance;
}
//普通方法
public function method()
{
echo '正常执行对象中的方法';
}
}
$ob1 = Uni::getInstance(); //获取uni的对象
$ob1->method();
echo "<br>";
$ob2 = Uni::getInstance();
$ob2->method();
echo "<br>";
if ($ob1 === $ob2) {
echo 'obj和ob2是同一个对象';
} else {
echo 'obj和ob2不是同一个对象';
}
运行结果如下 :
如果不使用单例模式,那么ob1和ob2就是两个对象
<?php
class Book
{
public function method()
{
echo '正在执行方法<br>';
}
}
$b1 = new Book();
$b1->method();
$b2 = new Book();
$b2->method();
if ($b1 === $b2) {
echo 'b1和b2是同一对象';
} else {
echo 'b1和b2是两个对象';
}
运行结果如下:
在类的外部,实例化对象的个数是无法控制的。