`
web001
  • 浏览: 98784 次
  • 性别: 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++实现

    单件模式(Singleton pattern)是设计模式中的一种结构型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于系统中需要频繁创建和销毁的对象,如日志服务、线程池或者数据库连接等...

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

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

    C++设计模式课件12_Singleton_单件模式.pdf

    ### 单件模式(Singleton Pattern)详解 #### 概述 单件模式是软件设计模式中最为基础且应用广泛的一种模式。它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。此模式通常用于那些需要频繁创建、消耗...

    设计模式 之 单件模式

    单件模式(Singleton Pattern)是设计模式中的一种,它的核心意图是确保一个类只有一个实例,并提供一个全局访问点。在软件工程中,这样的设计模式能够有效地控制资源的使用,限制实例的数量,以及协调对象间的交互...

    深入浅出设计模式之单件模式

    单件模式(Singleton Pattern)是软件设计模式中最为常见的一种,它的主要目标是确保某个类只有一个实例,并提供一个全局访问点。单件模式在很多情况下都非常有用,比如管理共享资源(如内存、文件句柄等)、作为...

    C#设计模式,单件模式,C#代码

    C#作为.NET框架的主要编程语言,广泛应用于各种复杂系统开发,其中单件模式(Singleton Pattern)是C#开发者经常会遇到的一种设计模式。本资源旨在帮助初学者理解并应用单件模式,通过关键代码实例,让你快速掌握这...

    c++实现单件模式 c++实现单件模式 c++实现单件模式

    单件模式(Singleton 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) ...

    设计模式\单件模式VS2005

    单件模式(Singleton Pattern)是软件设计模式中的一种经典模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如配置管理、线程池、数据库连接等需要全局唯一的...

    C#23种设计模式【完整】.pdf

    1. 单件模式(Singleton Pattern):确保一个类只有一个实例,并提供一个访问该实例的全局访问点。 2. 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而不需要指定具体的类别。 3...

    32种设计模式

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

    基于C#的设计模式中的单件模式

    单件模式(Singleton Pattern)是软件设计模式中的一种基础模式,它确保一个类只有一个实例,并提供一个全局访问点。在C#中,单例模式的实现有多种方式,包括懒汉式、饿汉式以及线程安全的实现。下面我们将详细讨论...

    设计模式代码——c#

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

    C语言设计模式 PDF《C Design Pattern》

    ### C语言设计模式知识点概述 #### 一、C语言与设计模式 在计算机科学领域,设计模式是指在软件设计过程中解决常见问题的一套被广泛接受的解决方案。虽然设计模式最初是在面向对象编程语言中被广泛应用的,但也...

    单件模式源代码

    单件模式(Singleton Pattern)是软件设计模式中最基础且常用的一种模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在需要控制实例化过程或者资源管理的场景中尤其适用,例如日志服务...

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

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

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

    C#设计模式(23种设计模式) 部分内容概述如下,下载可看... 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype)

Global site tag (gtag.js) - Google Analytics