单例模式绝对是在经常使用以及面试常问设计模式中排名首位的。一方面它够简单,三言两语就能说明白。另外一方面,它又够复杂,它的实现不只仅只有一种形式,并且在Java等异步语言中还要考虑多线程加锁的问题。因此在面试时,千万不要觉得面试官出单例模式的问题就放松了,这个模式真的是可深可浅,也极其能体现一个开发者的水平。由于只要工做过一段时间,不可避免的就会接触到这个模式。php
GoF定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。java
GoF类图nginx
代码实现git
class Singleton {
private static $uniqueInstance;
private $singletonData = '单例类内部数据';
private function __construct() {
// 构造方法私有化,外部不能直接实例化这个类
}
public static function GetInstance() {
if (self::$uniqueInstance == null) {
self::$uniqueInstance = new Singleton();
}
return self::$uniqueInstance;
}
public function SingletonOperation(){
$this->singletonData = '修改单例类内部数据';
}
public function GetSigletonData() {
return $this->singletonData;
}
}
复制代码
没错,核心就是这样一个单例类,没别的了。让静态变量保存实例化后的本身。当须要这个对象的时候,调用GetInstance()方法得到全局惟一的一个对象。github
$singletonA = Singleton::GetInstance();
echo $singletonA->GetSigletonData(), PHP_EOL;
$singletonB = Singleton::GetInstance();
if ($singletonA === $singletonB) {
echo '相同的对象', PHP_EOL;
}
$singletonA->SingletonOperation(); // 这里修改的是A
echo $singletonB->GetSigletonData(), PHP_EOL;
复制代码
客户端的调用,咱们会发现singletonB是彻底同样的对象。面试
公司愈来愈大,但咱们的所有公司的花名册都只有一份(单例类),保存在咱们的OA系统中。怕的就是各个部门拥有各本身的花名册后会产生混乱,好比更新不及时漏掉了其余部门新入职或者离职的员工。其余部门在须要的时候,能够去查看所有的花名册,也能够在所有花名册的基础上创建修改本身部门的部分。可是在OA系统中,其实他们修改的仍是那一份总的花名册中的内容,你们维护的其实都是保存在OA系统服务器中的那惟一一份真实的花名册数据库
完整代码:github.com/zhangyue050…设计模式
既然上面说过数据库操做类和网络请求类都很喜欢用单例模式,那么咱们就来实现一个Http请求类的单例模式的开发。记得在很早前作Android的时候,尚未如今这么多的框架,Http请求都是本身封装的,网上的教程中大部分也都是采起的单例模式。缓存
缓存类图服务器
<?php
class HttpService{
private static $instance;
public function GetInstance(){
if(self::$instance == NULL){
self::$instance = new HttpService();
}
return self::$instance;
}
public function Post(){
echo '发送Post请求', PHP_EOL;
}
public function Get(){
echo '发送Get请求', PHP_EOL;
}
}
$httpA = new HttpService();
$httpA->Post();
$httpA->Get();
$httpB = new HttpService();
$httpB->Post();
$httpB->Get();
var_dump($httpA == $httpB);
复制代码
说明
是否是忽然发现单例真的没有想象中的那么简单啊,还有这么多我不知道的东西。一我的从知道本身知道到知道本身不知道就是上升了一个台阶,再下去就是不知道本身知道了,到了这个阶段的码农那可都是高手中的高手了。单例模式就是这样一个经典经常使用的超级模式。为何叫超级模式呢?由于它和工厂两大模式真的能够说是面试必备题,不学可不行哦!下一个登场的是状态模式,从名字就能够看出,和类的状态有关,但具体是干吗的呢?咱们下回见。