单例模式

参考博文地址:https://github.com/baijunyao/design-patterns/blob/master/singleton/index.php

首先认识或者了解下单例模式的作用: 防止new多个实例,造成资源消耗过大,使用场景有数据库连接实例,通过单例,减少对mysql连接数量

普通实例创建代码
<?php

namespace Designpatterns\Singleton;

/*
	普通类
*/
class Db1 
{
	public static $instance = null;

	public function __construct()
	{

	}

	public function __clone()
	{

	}

	public static function getInstance()
	{
		if (null === static::$instance) {
			static::$instance = new Db1();
		}

		return static::$instance;
	}
}

$db1 = new Db1();
$db2 = new Db1();
$db3 = clone $db2;
$db4 = Db1::getInstance();


var_dump($db1);
echo "<br>";

var_dump($db2);
echo "<br>";

var_dump($db3);
echo "<br>";

var_dump($db4);
echo "<br>";

  • 运行结果,可以看到上面几个实例都是不同的,各自生成了不同的实例
    在这里插入图片描述
相比较之下 使用单例模式,看看它的效果
/*
	单例
*/

class Db2
{
	/*将instance 进行私有化*/
	private static $instance = null;

	/*将public的构造函数 私有化*/
	private function __construct()
	{

	}

	/*将public的克隆函数 私有化*/
	private function __clone()
	{

	}

	public static function getInstance()
	{
		if (null === static::$instance) {
			static::$instance = new Db2();
		}

		return static::$instance;
	}
}

// $db5 = new Db2(); //construct私有化 防止new多个实例
// $db6 = new Db2(); // 如果进行new会报错
// $db7 = clone $db5;   //clone 和上面new 实例类似
$db8 = Db2::getInstance();
$db9 = Db2::getInstance();

// var_dump($db5);
// echo"<br>";

// var_dump($db6);
// echo"<br>";

// var_dump($db7);
// echo"<br>";

var_dump($db8);
echo"<br>";

var_dump($db9);
echo"<br>";
  • 看看结果, 如果直接new会产生fatal,clone也是, 只有getInstance会获取到真正的实例对象,并且多个变量使用的都是同一个实例。
    在这里插入图片描述

我们可以通过"三私一公"来记单例

  1. 私有的静态变量,构造函数,克隆函数
  2. 公共的静态方法获取实例

疑问:为什么设置私有静态变量?而不是普通变量?为什么需要私有?
因为静态变量的设置起到的作用就是为了多个变量使用同一个实例,即该静态变量,为防止直接访问静态变量或者修改其值,我们加上了private

(欢迎吐槽) https://github.com/wuye251/design-patterns

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值