单例模式

php单例模式是怎么实现的呢

久未见 提交于 2020-02-12 00:30:06
<?php /** * 设计模式之单例模式 * $_instance必须声明为静态的私有变量 * 构造函数和析构函数必须声明为私有,防止外部程序new * 类从而失去单例模式的意义 * getInstance()方法必须设置为公有的,必须调用此方法 * 以返回实例的一个引用 * ::操作符只能访问静态变量和静态函数 * new对象都会消耗内存 * 使用场景:最常用的地方是数据库连接。 * 使用单例模式生成一个对象后, * 该对象可以被其它众多对象所使用。 */ class Example { //保存例实例在此属性中 private static $_instance; //构造函数声明为private,防止直接创建对象 private function __construct() { echo 'I am Construceted'; } //单例方法 public static function singleton() { if(!isset(self::$_instance)) { $c=__CLASS__; self::$_instance=new $c; } return self::$_instance; } //阻止用户复制对象实例 public function __clone() { trigger_error('Clone is not allow' ,E

PHP单例模式

妖精的绣舞 提交于 2020-02-12 00:22:10
首先我们要知道明确单例模式这个概念,那么什么是单例模式呢? 单例模式顾名思义,就是只有一个实例。 作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例, 这个类我们称之为单例类。 单例模式的要点有三个: 一是某个类只能有一个实例; 二是它必须自行创建这个实例; 三是它必须自行向整个系统提供这个实例。 下面我们讨论下为什么要使用PHP单例模式? 多数 人都是从单例模式的字面上的意思来理解它的用途, 认为这是对系统资源的节省, 可以避免重复实例化, 是一种"计划生育". 而PHP每次执行完页面都是会从内存中清理掉所有的资源. 因而PHP中的单例实际每次运行都是需要重新实例化的, 这样就失去了单例重复实例化的意义了. 单单从这个方面来说, PHP的单例的确有点让各位失望. 但是单例仅仅只有这个功能和应用吗? 答案是否定的,我们一起来看看。 1. php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时(废话), 如果使用单例模式, 则可以避免大量的new 操作消耗的资源。 2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看zend Framework的FrontController部分。 3. 在一次页面请求中, 便于进行调试, 因为所有的代码

PHP设计模式之:单例模式

我的梦境 提交于 2020-02-12 00:19:36
单例模式 (职责模式): 简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务; 单例类: 1 、构造函数需要标记为 private (访问控制:防止外部代码使用 new 操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化; 2 、拥有一个保存类的实例的静态成员变量 3 、拥有一个访问这个实例的公共的静态方法(常用 getInstance() 方法进行实例化单例类,通过 instanceof 操作符可以检测到类是否已经被实例化) 另外,需要创建 __clone() 方法防止对象被复制(克隆) 为什么要使用 PHP 单例模式? 1、php 的应用主要在于数据库应用 , 所以一个应用中会存在大量的数据库操作 , 使用单例模式 , 则可以避免大量的 new 操作消耗的资源。 2、如果系统中需要有一个类来全局控制某些配置信息 , 那么使用单例模式可以很方便的实现 . 这个可以参看 ZF的 FrontController 部分。 3、在一次页面请求中 , 便于进行调试 , 因为所有的代码 ( 例如数据库操作类 db) 都集中在一个类中 , 我们可以在类中设置钩子 , 输出日志,从而避免到处 var_dump, echo 。 代码实现: <111?111php111 /1** * 设计模式之单例模式 * $

php设计模式——单例模式

旧时模样 提交于 2020-02-11 22:56:00
单例模式概念 单例模式是指整个应用中类只有一个对象实例的设计模式。 单例模式的特点 一个类在整个应用中只有一个实例 类必须自行创建这个实例 必须自行向整个系统提供这个实例 php中使用单例模式的原因 我用php大部分操作都是和各种数据库打交道,包括mysql,redis,memcache等各种关系型和非关系型数据库,所以一个应用中会 存在大量连接数据库的操作,如果不用单例模式,那每次都要new操作,但是每次new都会消耗大量的内存资源和系统资源,而且每次打开和关闭数据库连接都 是对数据库的一种极大考验和浪费。 贴出我之前常用的不好的数据库连接代码,给大家一个错误示范: <?php class MysqlConn { // MYSQL数据库连接信息 const MYSQLHOSTNAME = "127.0.0.1" ; const MYSQLUSERNAME = "root" ; const MYSQLPASSWORD = "***" ; const MYSQLDBNAME = "test" ; const MYSQLCHARSET = "utf8" ; /** * Description:mysql数据库连接函数 * Return value:连接成功返回数据库连接句柄;连接失败返回错误消息 */ public function MysqlConnect() { $db = new

Java开发中的23种设计模式详解

廉价感情. 提交于 2020-02-11 17:19:17
一、设计模式的分类 总体来说设计模式分为三大类: 1. 创建型模式 共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 2. 结构型模式 共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 3. 行为型模式 共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 4. 其它 并发型模式和线程池模式。用一个图片来整体描述一下: 回到顶部 二、设计模式的原则(先不看) 1、开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。 2、里氏代换原则(Liskov Substitution Principle) 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为

单例模式

人走茶凉 提交于 2020-02-11 12:55:21
定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。    Singleton:负责创建Singleton类自己的唯一实例,并提供一个getInstance的方法,让外部来访问这个类的唯一实例。 分类:   懒汉式(时间换空间):不加同步时线程不安全     1.线程不安全 public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }     2.线程安全(加锁,效率慢) public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() {   if (instance == null) {   instance = new Singleton();    }   return instance; } }     3.双重加锁机制    

单例模式 Singleton

坚强是说给别人听的谎言 提交于 2020-02-11 12:27:47
单例模式 简介 单例模式保证内存中对象只存在一个实例 单例模式分为 饿汉式 和 懒汉式 饿汉式 特点 当类被加载到内存时,就会实例化对象,保证JVM线程安全 缺点:不管使不使用,类加载时就会实例化 懒汉式 特点 按需加载,类尽管被加载到内存中,但不会立刻被实例化 第一次使用时会实例化,以后便存在内存中 缺点:多线程访问时,可能会创建多个实例 8种单例模式 第一种 饿汉式 /** * 单例模式:保证内存中只有一个实例 * 饿汉式 * 类加载到内存后,就实例化一个单例,JVM保证线程安全 * 简单使用,推荐使用 * 唯一缺点:不管使不使用,类加载时就完成实例化 */ public class Mgr1 { private static final Mgr1 INSTANCE = new Mgr1 ( ) ; /** * 阻止外部创建实例对象 */ private Mgr1 ( ) { } public static Mgr1 getInstance ( ) { return INSTANCE ; } } 第二种 饿汉式:在静态块中实例化对象 /** * 单例模式:保证内存中只有一个实例 */ public class Mgr2 { private static final Mgr2 INSTANCE ; static { INSTANCE = new Mgr2 ( ) ; } /**

单例模式

帅比萌擦擦* 提交于 2020-02-10 05:33:15
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 介绍 意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 主要解决: 一个全局使用的类频繁地创建与销毁。 何时使用: 当您想控制实例数目,节省系统资源的时候。 如何解决: 判断系统是否已经有这个单例,如果有则返回,如果没有则创建。 关键代码: 构造函数是私有的。 应用实例: 1、一个党只能有一个主席。 2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。 3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。 优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 2、避免对资源的多重占用(比如写文件操作)。 缺点: 没有接口

设计模式:单例模式

自作多情 提交于 2020-02-10 01:11:08
单例模式就是采取一定方法保证在整个软件系统中,对于某个类只能存在一个对象的实例,并且该类只提供一个取得其对象实例的方法。属于创建型。 优点 在内存里只有一个实例,减少了内存开销 可以避免对资源的多重占用 设置全局访问点,严格控制访问 单例的实现 懒汉式 /** * 懒汉式单例模式 * (在多线程下不能保证创建的实例是唯一的) */ public class LazySingleton { private LazySingleton(){} //和饿汉式不同,这里不实例化,而是在需要的时候再去new private static LazySingleton instance; //在多线程下不能保证创建的实例是唯一的 public static LazySingleton getInstance(){ if(instance==null){ instance = new LazySingleton(); } return instance; } } 懒汉式改进(线程安全) /** * 懒汉式改进 线程安全的单例模式 */ public class SynchronizedSingleton { private SynchronizedSingleton(){} //和饿汉式不同,这里不实例化,而是在需要的时候再去new private static volatile

设计模式之单例模式 王泽宾

穿精又带淫゛_ 提交于 2020-02-09 19:46:36
1 单例模式的日常应用 我们在浏览BBS、SNS网站的时候,常常会看到“当前在线人数”这样的一项内容。对于这样的一项功能,我们通常的做法是把当前的在线人数存放到一个内存、文件或者数据库中,每次用户登录的时候,就会马上从内存、文件或者数据库中取出,在其基础上加1后,作为当前的在线人数进行显示,然后再把它保存回内存、文件或者数据库里,这样后续登录的用户看到的就是更新后的当前在线人数;同样的道理,当用户退出后,当前在线人数进行减1的工作。所以,对于这样的一个需求,我们按照面向对象的设计思想,可以把它抽象为“在线计数器”这样一个对象,具体实现如下: Java代码: //在线人数计数器 class OnlineCounter { //在线人数 private int onlineCount = 0; //构造函数 public OnlineCounter(){ //从文件或者数据库读取数据,假如读出来的数据是100 this.onlineCount = 100; } //在用户登录后,在线人数加1 public void incCount(){ this.onlineCount++; } //在用户退出后,在线人数减1 public void decCount(){ this.onlineCount--; } //保存在线人数 public void saveCount(){ } /