设计模式之单例模式

设计模式的使用场景、用法,优缺点说明:网络上抄一段过来

PHP一个主要应用场合就是应用程序与数据库打交道的场景,数据库连接

要点主要有三个:

  1. 一个类只能有一个对象;
  2. 必须是自行创建这个类的对象;
  3. 要想整个系统提供这一个对象;

从具体实现角度来说,就是以下三点: 一是单例模式的类只提供私有的构造函数, 二是类定义中含有一个该类的静态私有对象, 三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。

当然还要有一个private的clone方法,防止克隆;

优点 一、实例控制 单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。 二、灵活性 因为类控制了实例化过程,所以类可以灵活更改实例化过程。

缺点 一、开销 虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。 二、可能的开发混淆 使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。

上代码:

<?php
/**
 * Created by PhpStorm.
 * User: xiaoyuan.shu
 * Date: 2019/7/19
 * Time: 11:28
 */

namespace App\Http\Controllers\Common;


class SingleController {
	
	//创建静态私有的变量保存该类对象
	static private $instance;
	
	//参数
	private $config;
	
	//防止直接创建对象
	private function __construct($config) {
		$this->config = $config;
	}
	
	//防止克隆对象
	private function __clone() {
	
	}
	
	//静态方法 用以实例化调用
	static public function getInstance($config) {
		//判断$instance是否是本类对象,没有则创建
		// instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例,有多种用法
		if (!self::$instance instanceof self) {
			self::$instance = new self($config);
		}
		return self::$instance;
		
	}
	
	public function getName() {
		echo $this->config;
	}
}

//调用
$a = SingleController::getInstance(100);
$a->getName();
echo '<br>';
$b = SingleController::getInstance(200);
$b->getName();

//输出为
100
100