您的位置 首页 php

7 PHP 设计模式系列「单例模式(Singleton)」

1、模式定义

简单说来, 单例模式 的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个,同时这个类还必须提供一个访问该类的全局访问点。

常见使用实例:数据库连接器;日志记录器(如果有多种用途使用多例模式);锁定文件。

2、UML类图

3、示例代码

Singleton.php

<?php
namespace DesignPatterns\Creational\Singleton;
/**
 * Singleton类
 */class Singleton
{
 /**
 * @var Singleton reference to singleton instance
 */ private  static  $instance;
 
 /**
 * 通过延迟加载(用到时才加载)获取实例
 *
 * @return self
 */ public static function  getInstance ()
 {
 if (null === static::$instance) {
 static::$instance = new static;
 }
 return static::$instance;
 }
 /**
 *  构造函数 私有,不允许在外部 实例化 
 *
 */ private function __construct()
 {
 }
 /**
 * 防止对象实例被克隆
 *
 * @return void
 */ private function __clone()
 {
 }
 /**
 * 防止被反 序列化 
 *
 * @return void
 */ private function __wakeup()
 {
 }
}
 

4、测试代码

Tests/SingletonTest.php

<?php
namespace DesignPatterns\Creational\Singleton\Tests;
use DesignPatterns\Creational\Singleton\Singleton;
/**
 * SingletonTest用于测试单例模式
 */class SingletonTest extends \PHPUnit_Framework_TestCase
{
 public function testUniqueness()
 {
 $firstCall = Singleton::getInstance();
 $this->assertInstanceOf('DesignPatterns\Creational\Singleton\Singleton', $firstCall);
 $secondCall = Singleton::getInstance();
 $this->assertSame($firstCall, $secondCall);
 }
 public function testNoConstructor()
 {
 $obj = Singleton::getInstance();
 $refl = new \ReflectionObject($obj);
 $meth = $refl->getMethod('__construct');
 $this->assertTrue($meth->isPrivate());
 }
}
 

文章来源:智云一二三科技

文章标题:7 PHP 设计模式系列「单例模式(Singleton)」

文章地址:https://www.zhihuclub.com/154429.shtml

关于作者: 智云科技

热门文章

网站地图