php-单例模式实现
概述
单例模式(Singleton Pattern):确保某一个类只有一个实例且自行实例化并向整个系统提供这个实例,这个类称之为单例类,它提供全局访问的方法。
单例模式的要点有三个:
- 单例类必须自行向整个系统提供这个实例。
- 单例类只能有一个实例
- 单例类的实例必须由自己创建
我们拿摩托制造和质检员拿到摩托车以供检测视作一个单一的完整流程。摩托组装员工负责发动机、车体、车轮的工作,在此之后质检员通过组装工人拿到摩托车。由于人手有限(只有一个工人,一个质检员),我们设计的工作流程就是一个组装工人只能造一辆摩托车然后直到质检员来做质量检测无误后才能进行下一辆的摩托车建造工作。
模式结构
单例模式包含如下角色:
以本文实例代码为参考
- MotorSingleton 摩托单例类
- WorkersAssemble:组装工人类
- QualitativeCheckMember:质检类
图例
以本文实例代码为参考
代码实例
<?php
/**
* +----------------------------------------------------------------------+
* php23种设计模式实现-单例模式
* Author:微信公众号:yuantanphp
* 获取更多资源,技术答疑,项目合作请关注微信公众号:yuantanphp
* +----------------------------------------------------------------------+
*/
/**单例类 */
class MotorSingleton{
//用于保存实例
private static $instance;
//防止外部创建实例
private function __construct(){}
//防止复制实例
private function __clone(){}
private $motor = [
"engine"=>"",
"body"=>"",
"whell"=>"",
"bodyColor"=>"blue"
]; //公有方法,用于获取实例
public static function getInstance(){
//判断实例有无创建,没有的话创建实例并返回,有的话直接返回
if(!(self::$instance instanceof self)){
self::$instance = new self();
}
return self::$instance;
}
/**发动机组装 */
public function addEngine($engine){
$this->motor["engine"] = $engine;
}
/**车身组装 */
public function addBody($body){
$this->motor["body"] = $body;
}
/**车轮组装 */
public function addWhell($whell){
$this->motor["whell"] = $whell;
}
/**获取摩托 */
public function getMotor(){
return $this->motor;
}
}
/**组装工人 */
class WorkersAssemble{
//组装摩托车
public function assemble(){
MotorSingleton::getInstance()->addEngine("发动机已组装");
MotorSingleton::getInstance()->addBody("车体已组装");
MotorSingleton::getInstance()->addWhell("车轮已组装");
}
}
/**质检员类 */
class QualitativeCheckMember{
//获取摩托车
function getMotor(){
return MotorSingleton::getInstance()->getMotor();
}
}
$workersAssemble = new WorkersAssemble();
$workersAssemble->assemble();
$qualitativeCheckMember = new QualitativeCheckMember();
$motor = $qualitativeCheckMember->getMotor();
var_dump($motor);
模式分析
单例模式的目的是保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式包含的角色只有一个,就是单例类——Singleton。单例类拥有一个私有构造函数,私有克隆方法。确保无法通过外部直接实例化/克隆它。另外,单例模式中包含一个静态私有成员变量和静态公有的工厂方法,该工厂方法用于检测实例是否存在并实例化自己。然后存储在静态变量中。以确保只有一个实例被创建。
在实现单例模式的过程中,需要注意以下几点
- 单例类的构造函数,克隆函数为私有
- 提供一个自身的静态私有成员变量
- 提供一个公有的静态工厂方法
优缺点
单例模式的优点
- 提供了全局唯一实例的访问,因为单例封装了它的唯一实例,所以他可以控制客户的访问方式以及为团队提供了共享的概念。
- 可以降低系统资源的消耗,对于一些需要频繁创建的对象,单例模式可以大大的提高系统的性能。
单例模式缺点
- 单例模式的实例唯一性带来的问题就是拓展性不够灵活,造成单例类的职责过重,在一定程度上违背了单一职责原则。
- 对于提供了垃圾回收机制的面向对象而言,在对象长时间不用的情况下,系统会自动销毁并回收资源,因此可能会导致对象状态的丢失。
适用环境
在以下情况下可以使用单例模式:
- 系统只需要一个实例化对象
- 对于调用者只开放一个公共访问点。
关注微信公众号(yuantanphp) | |
---|---|
回复关键字 设计模式 可获取以下材料 《设计模式:可复用面向对象软件的基础》pdf版. php设计模式23种实例实现php源码 | ![]() |