`
web001
  • 浏览: 96154 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

PHP设计模式:单件模式(Singleton Pattern)

    博客分类:
  • PHP
阅读更多

在上一章中,我们介绍了PHP设计模式里面的工厂模式。工厂模式是一个可以批量创建对象实例的模式,但是有时候我们经常会遇到一个与此问题相反的场景,不需要创建很多的各种各样的对象,我们需要的是,只创建几个对象,很多情况下是只需要一个对象,然后在以后的程序中持续使用此对象。

 

例如,在 CMS 或者其它类似的管理系统中,经常使用到的数据库连接资源,这个资源只需要在程序启动的时候创建出来,并对其进行初始化,当程序结束的时候,断开数据库连接,将此资源销毁并回收。数据库连接通常是很消息资源的,CPU或者内存或者网络带宽等,如果每次需要使用此链接的时候都创建一次,使用完成后销毁,这样效率是极低的。如果可以将已经建立好的连接重新使用的话,就不要使用复制/粘贴的模式来实现代码复用了。

 

这正是本章中将要介绍的单件模式(Singleton Pattern)。维基百科给出的定义是:“单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。”

 

问题

 

这个类的行为很特殊,因为他在整个程序的生命周期呢,它的对象实例是独一无二的。当我们创建一个这样的实例后,它就是唯一的,不存在此类的第二个实例。

 

解决方案

 

我们首先想到的就是全局变量。但是经验告诉我们,尽量避免使用全局变量,但是也不尽然。

 

通常,使用全局变量被认为是坏习惯,这正是由于全局变量的非局部性:全局变量可能被从任何地方修改(除非位于保护内存中),也可能被任何地方所依赖。于是全局变量便拥有了建立相互依存关系的无限可能,而互相依存关系的建立会使得复杂度增加。然而,在少数情况下是适合使用全局变量的。例如,可以通过全局变量的使用来避免常用变量在一系列函数间的频繁传递。

 

为了防止产生此类的其他实例,通常需要将它的构造函数设置为 private 类型,禁止在类外创建此对象的实例。那么我们将如何构建此对象呢?通常我们需要一个构造该对象的方法,一般使用名为 getInstance() 的静态方法。

 

下面是一个例子:

 

class DbConn {
    function DbConn($fromGetInstance=false) {
        if (M_E != $fromGetInstance) {
            trigger_error("The DbConn class is a Singleton,"
                ." please do not instantiate directly.");
        }
    }

    function &getInstance() {
        $key = "__some_unique_key_for_the_DbConn_instance__";
        if (!(array_key_exists($key, $GLOBALS) && is_object($GLOBALS[$key])
            && "dbconn" == get_class($GLOBALS[$key]) )) {
                $GLOBALS[$key] =& new DbConn(M_E);
        }
        return $GLOBALS[$key];
    }
} 

代码解释:

 

在此代码中,使用了 getInstance() 静态函数,在此函数中也使用了全局变量 $GLOBALS,当我们第二次创建此对象的时候首先进行判断该对象是否已经实例化,如果已经实例化,则不需要重复创建,只需要返回已经实例话的对象。

 

原文链接:http://tjwzjs.cn/news/knowledge/2012/1213/61.html

2
3
分享到:
评论
1 楼 netkiller.github.com 2012-12-13  
不是误导读者,PHP进程间是隔离的,A进程$GLOBALS[$key] =& new DbConn(M_E); B进程根本访问不到。同时A进程运行完成会销毁所有顶一的变量。

这里会产生两个进程两个独立 $GLOBALS , 仅能在进程的生存期内使用。

验证代码
<?php
if (isset($GLOBALS['c'])){
        $GLOBALS['c']++;
}else{
        $GLOBALS['c']=1;
}

echo $GLOBALS['c'];



如果A用户看到是1 ,那么B用户应该看到 2 ,C 用户是3 。。。

不要拿java生拿硬套。
java 单件是可以提高性能,如果程序不健壮,更容易崩溃。
php 每次都要重复工作,但解决崩溃问题。
各有优缺,无好坏

相关推荐

    Head First 设计模式 (五) 单件模式(Singleton pattern) C++实现

    Head First 设计模式 (五) 单件模式(Singleton pattern) C++实现

    设计模式:可复用面向对象软件的基础--详细书签版

    3.5 singleton(单件)—对象创建型 模式 84 3.6 创建型模式的讨论 89 第4章 结构型模式 91 4.1 adapter(适配器)—类对象结构型 模式 92 4.2 bridge(桥接)—对象结构型 模式 100 4.3 composite(组成)...

    软件开发中常用的23种设计模式

    软件开发常用用23中开发模式 如:单件模式(Singleton Pattern) 、抽象工厂(Abstract Factory) 、桥接模式(Bridge Pattern) 等等

    C#设计模式_设计模式_C#_

    单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype)结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge ...

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm” 供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) ...

    32种设计模式

    C# 32种设计模式: 创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) ...

    设计模式 之 单件模式

    架构和模式应该是一个属于相互涵盖的过程,但是总体来说架构更加关注的是所谓的High-Level Design,而模式关注的重点在于通过经验提取的“准则或指导方案”在设计中的应用,因此在不同层面考虑问题的时候就形成了不同...

    C#设计模式(23种设计模式)

    单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接...

    设计模式代码——c#

    C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器...

    23种设计模式 (创建型,结构型,行为型)

    单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接...

    PHP设计模式之单例模式定义与用法分析

    单例模式(Singleton Pattern 单件模式或单元素模式),是常见的一种设计模式,它有三个特点 1.只能有一个实例 2.必须自行创建这个实例 3.必须给其他对象提供这一实例 下面用PHP代码实现一下 &lt;?PHP /** *...

    设计模式 design pattern

    3.5 Singleton(单件)—对象创建型 模式 84 3.6 创建型模式的讨论 89 第4章 结构型模式 91 4.1 Adapter(适配器)—类对象结构型 模式 92 4.2 Bridge(桥接)—对象结构型 模式 100 4.3 Composite(组成)—对象...

    设计模式,软件开发者必读

    设计模式的个人总结教材,适合IT专业人士研究,目录如下: 序言 概念 6 1.1 设计模式的定义 6 1.2 设计模式的作用 6 1.3 设计模式的由来 6 1.4 设计模式的分类 7 1.5 OO设计七原则 7 1.5.1 开-闭原则(OPEN-CLOSED ...

    Singleton Pattern 源码

    提供简单易懂的单件设计模式源码,为你学习这种模式提供更好捷径.

    设计模式 GOF 23

    本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用...

    《设计模式》中文版(23个设计模式的介绍与运用)

    3.5 Singleton(单件)—对象创建型 模式 84 3.6 创建型模式的讨论 89 第4章 结构型模式 91 4.1 Adapter(适配器)—类对象结构型 模式 92 4.2 Bridge(桥接)—对象结构型 模式 100 4.3 Composite(组成)—对象...

    C#23种设计模式

    1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式...

    二十三种设计模式【PDF版】

    设计模式之 Singleton(单态/单件) 阎宏博士讲解:单例(Singleton)模式 保证一个类只有一个实例,并提供一个访问它的全局访问点 设计模式之 Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new 一样频繁. ...

Global site tag (gtag.js) - Google Analytics