设计模式专题(十七) ——单例模式

设计模式专题(十七)——单例模式

(原创内容,转载请注明来源,谢谢)

一、概述

单例模式(Singleton)保证一个类仅有一个实例,并提供一个访问它的全局访问点。通常会在类内部提供一个变量存储自身的实例,保证没有其他实例被创建,保证该实例是类的唯一实例。

单例模式可以严格控制客户的访问方式,保证唯一的实例。

二、多线程情况下的单例

当多线程中,多个线程同时访问类,还是有可能会创建出多个实例,则需要加锁。锁是为了保证代码处于临界区时,另一个线程不进入临界区。

当程序被上锁,其他访问的程序会阻塞,直等到锁被释放才可以访问。另外,需要在上锁之前加一层判断,如果类已经实例化,则直接返回类的实例,而不需要去加锁后再判断。

三、PHP中的单例模式

PHP由于很少涉及到多线程,因此通常不需要进行加锁。另外,由于PHP的页面被执行后,所有的变量都会被回收,这也使得PHP语言级别上无法实现变量的常驻(除非通过将实例化的遍历序列化后存在redis或memcache等缓存中实现)。

因此,对于php而言,单例模式通常是为了防止单个页面高并发的情况下,实例化太多类出现的问题。

最常见的就是对数据库的连接采用单例模式,因为mysql数据库有最大连接数限制,当大量的连接发生,会导致无法连接数据库,则可以实现单例模式。

四、单例模式要点

1、私有化构造函数和克隆函数

php的魔术方法构造函数和克隆函数,需要设置成private,这样用户就无法通过new的方式获取类的实例化。

2、定义一个私有化静态变量,用于存储类的实例化。

3、定义一个public的静态方法,去判断上述变量是否有内容,有则返回,没有则进行实例化。

五、单例模式实现数据库连接

<?php
//单例模式实现数据库连接
class Db{
         private static $ins;
         private static $conn;
         private function__construct(){}
         private function__clone(){}
         public static functiongetInstance(){
                   if(null ==self::$ins || !(self::$ins instanceof self)){
                            self::$ins= new self();
                            self::$conn= new PDO('mysql:host=127.0.0.1;dbname=testdb,root,root');
                   }
                   returnself::$ins;     
         }
         public functiongetConn(){
                   return$this->conn;
         }
}

——written by linhxx 2017.08.15

相关阅读:

设计模式专题(十六)——迭代器模式

设计模式专题(十五) ——组合模式

设计模式专题(十四)——适配器模式

设计模式专题(十三) ——备忘录模式

设计模式专题(十二)——状态模式

设计模式专题(十一)——抽象工厂模式

设计模式专题(十)——观察者模式

设计模式专题(九) ——外观模式

设计模式专题(八) ——模板方法模式

设计模式专题(七)——建造者模式

设计模式专题(六)——原型模式

设计模式专题(五)——工厂方法模式

设计模式专题(四)——代理模式

设计模式专题(三)——装饰模式

设计模式专题(二)——策略模式

设计模式专题(一)——面向对象的设计原则

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-08-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏增长技术

git对象模型

所有用来表示项目历史信息的文件,是通过一个40个字符的(40-digit)“对象名”来索引的,对象名看起来像这样:

14030
来自专栏JAVA技术zhai

JVM虚拟机详解

  JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿...

16520
来自专栏逆向技术

16汇编第十讲完结Call变为函数以及指令的最后讲解

16汇编完结Call变为函数以及指令的最后讲解 学了10天的16位汇编,这一讲就结束了,这里总结一下昨天的LOOP指令的缺陷,因为lOOP指令的缺陷,所以我们都...

193100
来自专栏Android群英传

Gradle函数复用的一点实践

15210
来自专栏后端技术探索

vim神奇高效功能--批量生成Sql实例

可以通过写代码,读取文件进行入库,无论用什么语言,这代码逻辑都很容易实现。唯一的问题是代码需要上线后执行,每次上线可是一个大工程,恐怕会被pm同学嘲笑说:“你这...

11630
来自专栏个人随笔

房上的猫:JavaDoc注释

//这是一个注释 /*   *这是一个演示程序   */ /**    *@这是JavaDoc注释。   */ JavaDoc注释    背景:       j...

371100
来自专栏安恒网络空间安全讲武堂

专题 | Python编写渗透工具学习笔记一

目录&基础知识 0x00 Python编程中一些模块的简单介绍(基础知识) 0x01web目录扫描程序 --脚本代码的实现和分析 --优化脚本 0x02实现一个...

38270
来自专栏java一日一条

Java 编程要点之并发(Concurrency)详解

计算机用户想当然地认为他们的系统在一个时间可以做多件事。他们认为,他们可以工作在一个字处理器,而其他应用程序在下载文件,管理打印队列和音频流。即使是单一的应用程...

9620
来自专栏苦逼的码农

线程安全(上)--彻底搞懂volatile关键字

对于volatile这个关键字,相信很多朋友都听说过,甚至使用过,这个关键字虽然字面上理解起来比较简单,但是要用好起来却不是一件容易的事。

14140
来自专栏唐郑望的专栏

Go 语言之三驾马车

Go 语言的三个核心设计: interface 、goroutine 、 channel。

1.9K00

扫码关注云+社区

领取腾讯云代金券