PHP 面向对象:设计模式之单例模式

单例模式要解决的问题就是“如何让这个类只有一个实例”。

我们的web应用中,大量使用了数据库连接,如果反复建立与数据库的连接必然消耗更多的系统资源。

我们如何解决这个问题,建立唯一的数据库连接是必要的方式。

我们又如何知道与这个数据库的连接是否已经建立? 还是需要现在建立?

单例模式可以解决这个问题。

先假设我们需要一个类完成在内存中只有一份的功能,我们该如何做呢?

我们一步一步的使用前面学过的知识来写一个单例的例子。

前面学过,每次用 new 类名 的方式,就可以创建一个对象。我们必须禁止外部程序用 new 类名的方式来创建多个实例。

解决办法是:我们将构造函数设置成 private ,让构造函数只能在内部被调用,而外部不能调用。这样,这个类就不能被外部用 new 的方式建立多个实例了。

以下是不能被外部用new实例化的类。

<?

class A{

    private function __construct(){}   

}

$a = new A();

?>

程序运行结果为:

Fatal error: Call to private A::__construct() from invalid context in E:\PHPProjects\test.php on line 6

我们已经禁止外部用new实例化这个类,我们改如何让用户访问这个类呢?前门堵了,我们需要给用户留个后门。
解决办法是:static 修饰的方法,可以不经实例化一个类就可以直接访问这个方法。

//不能用new实例化的类.<br>

//static的方法留给外部访问.<br>

//在方法内部返回实例.<br><br>

<?

class A{

    private function __construct(){}

    static function getClassA(){

        $a = new A();

        return $a;

    }       

}

// 看到这里确实返回的是 A 的实例.但不是同一个对象.

$a1 = A::getClassA();

$a2 = A::getClassA();

echo "\$a1 的类是 ".get_class($a1)." , \$a2 是 ".get_class($a1);

if($a1 === $a2){

   echo "<br> \$a1 \$a2 指向同一对象.";

}else{

   echo "<br> \$a1 \$a2 不是一个对象.";

}

?>

程序运行结果为:

$a1 的类是 A , $a2 是 A

$a1 $a2 不是一个对象.

我们已经通过static方法返回了A的实例。但还有问题。我们如何保证我们多次操作获得的是同一个实例的呢?

解决办法:static的属性在内部也只有一个。static
属性能有效的被静态方法调用。将这个属性也设置成private,以防止外部调用。先将这个属性设置成 null。每次返回对象前,先判断这个属性是否为
null 。如果为 null 就创建这个类的新实例,并赋值给这个 static 属性。如果不为空,就返回这个指向实例的 static 属性。

//不能用new实例化的类.<br>

//static的方法留给外部访问.<br>

//在方法内部返回实例.<br>

//定义静态属性保证这个实例能被静态方法调用.<br>

//增加判断部分.<br><br>

<?

class A{

    private static $a = null;

    private function __construct(){}

    static function getClassA(){

        if( null == self::$a){

            self::$a = new A();

        }      

        return self::$a;

    }       

}

// 看到这里确实返回的是 A 的实例.但不是同一个对象.

$a1 = A::getClassA();

$a2 = A::getClassA();

echo "\$a1 的类是 ".get_class($a1)." , \$a2 是 ".get_class($a1);

if($a1 === $a2){

   echo "<br> \$a1 \$a2 指向同一对象.";

}else{

   echo "<br> \$a1 \$a2 不是一个对象.";

}

?>

程序运行结果为:

$a1 的类是 A , $a2 是 A

$a1 $a2 指向同一对象.

到此,我们写了一个最简单的单例模式 。

现在,你可以尝试写一个应用单例设计模式的数据库连接类。

要记住单例模式的使用效果和书写方式。

时间: 2024-08-25 08:00:52

PHP 面向对象:设计模式之单例模式的相关文章

文成小盆友python-num8 面向对象中的成员,成员修饰符,特殊成员,异常处理,设计模式之单例模式

本节主要内容: 1.面向对象中的成员 2.成员修饰符 3.特殊成员 4.异常处理 5.设计模式之单例模式 一.面向对象中的成员(类的成员) 类的成员总共可以分为3大类,每类中有不同的分支. 1.总述,基本分类 如下图所示: 类成员包括字段,方法,和属性 2.字段 如上图字段分为普通字段和静态字段,两者的使用有区别,但是最大的区别在于两者在内存中的保存位置有区别. 普通字段属于对象而静态字段属于类,在使用过程中谁的字段就由谁来调用. 静态字段和普通字段的定义如下: 在调用时分各自调用 #####类

[转]JAVA设计模式之单例模式

原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话

PHP面向对象设计模式

PHP设计模式——概述 常见的面向对象设计模式大约有23种,但是自从接触PHP后,渐渐发现常见的设计模式好像少了很多,网络上的资料也比较少,身边的PHP同事们有的甚至没有听说过设计模式,这也有可能是PHP的发展所带来的,因为PHP对面向对象支持的比较晚,好多PHP程序员还按照面向过程的思想写代码.于是,我决定把原来用C#写的面向对象设计模式用PHP改写. 经常听见其他程序员(Java. C#)等说PHP是不是运行在浏览器端的脚本语言,其实我在接触PHP之前也这样认为过,后来发现PHP是用C语言开

设计模式(4)单例模式

概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机可以有若干个打印机,但只能

JAVA设计模式之单例模式(转)

本文继续介绍23种设计模式系列之单例模式. 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器

第8篇-JAVA面向对象-设计模式Ⅳ

第8篇-JAVA面向对象-设计模式Ⅳ 每篇一句 : 想象是程序的创作之源 初学心得 : 平静的海洋练不出熟练的水手 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-04-11| JAVA面向对象 Ⅳ] JAVA设计模式 什么是JAVA设计模式以及作用? 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结 使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性,本篇将介绍10种JAVA常用设计模式 1.JAVA 设计模式 - 单例设计模式 单例模

设计模式之单例模式——Singleton

                    设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有公开的调用方法.而且,别的类不能实例化它,所以构造方法要设置为私有的. 单例模式的要点 一是某个类只能有一个实例: 二是它必须自行创建这个实例: 三是它必须自行向整个系统提供这个实例. 例如: 有一个"单例对象",而"客户甲"."客户乙" 和&quo

PHP设计模式之单例模式简单代码介绍

PHP设计模式之单例模式 单例模式是一种创建型模式,它会限制应用程序,使其只能创建某一特定类类型的一个单一的实例.举例来说,一个web站点将会需要一个数据库连接对象,但是应该有且只能有一个,因此我们通过使用单例模式来实现这种限制. 我们可以使用一个静态属性来保证对于一个特定的类来说只存在一个单一的实例. Class someclass{ Static private $_instance = NULL; } [示例]config类实现了单例模式,以便整个web应用程序可以使用同一个配置对象. <

php设计模式:单例模式

前些日子开始着真正的去了解下设计模式,开始么,简单地从单例模式开始,当然网上看了一些资料,单例模式比较好理解,看看介绍,然后看看代码基本也就能够理解了,设计模式这些的花点心思基本的是能够理解的,当然要想很好的运用到项目上也是需要一定的实践,不能只是知道了解,或者说的是很厉害很懂的,一到要实际操作就不行了,废话就不多说了,PHP战线上的同志们都加油吧:单例模式(职责模式):简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务:单例类:1.构造函数需要标记为priv

php设计模式 1单例模式

之前很长时间之前就学习过设计模式,但是因为在实践中很少应用,所以忽略了,但现在却意识到设计模式很重要的,程序设计简介高效冗余性代码少. 今天开始把前几天学习的几个设计模式整理一下,首先当然是单例模式. 单例模式: 简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务: 单例类: 1.构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化: 2.拥有一个保存类的实例的静态成员变量: 3.拥