目的
使应用中只存在一个对象的实例,并且使这个单实例负责所有对该对象的调用。
单例模式 vs 工厂模式
单例模式解决如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过new建立实例对象的方法。
单例模式
单例模式 UML图
$_instance必须声明为静态的私有变量
构造函数和析构函数必须声明为私有,防止外部程序new 类从而失去单例模式的意义
getInstance()方法必须设置为公有的,必须调用此方法 以返回实例的一个引用
::操作符只能访问静态变量和静态函数
new对象都会消耗内存
使用场景:最常用的地方是数据库连接。
使用单例模式生成一个对象后, 该对象可以被其它众多对象所使用。
私有的__clone()方法防止克隆对象
举例
单例模式,使某个类的对象仅允许创建一个。构造函数private修饰, 申明一个static getInstance方法,在该方法里创建该对象的实例。如果该实例已经存在,则不创建。如下代码对数据库操作进行单例模式代码设计<?php
namespace Common;
final class Db{
private static $db = null;
//唯一可以创建/获取 Db类实例的方法
public static function getInstance(){
if (static::$db === null) {
//条件判断Db类是否已经new过
//构造方法被设置为了私有的,外部不能直接new,但自己内部可以new
static::$db = new static();
}
return static::$db;
}
//禁止使用 new 创建Db类
private function __construct(){
}
//禁止使用 clone 创建Db类
private function __clone()
{
}
//禁止使用 反序列化 创建Db类
private function __wakeup()
{
}
//下面省略一系列操作数据库的方法
}
单例模式的应用场景很多,比如:线程池、缓存、日志对象、数据库操作、显卡的驱动程序等
发表评论 取消回复