什么是单例模式 (什么是单例模式和多例模式)

本文目录导航:

什么是单例模式

单例模式是一种软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。

什么是单例模式 (什么是单例模式和多例模式)

单例模式的主要目的是确保某个类只有一个实例,并且提供一个全局访问点来访问这个实例。

这种模式常用于管理资源或配置信息,确保在整个应用程序中只有一个对象实例被创建和使用。

下面详细解释单例模式的几个要点:

单例模式的定义和特点

单例模式的核心是控制类的实例化过程,避免在程序中创建多个对象实例。

这种模式有几个特点:一是全局只有一个实例;二是提供全局访问点来获取这个唯一实例;三是通常使用静态变量或容器来存储唯一实例。

这种模式在需要频繁进行数据库操作或文件操作等场合非常有用,因为频繁创建和销毁对象会消耗大量系统资源。

通过单例模式,我们可以避免这些不必要的开销。

单例模式的实现方式

实现单例模式有多种方法,如懒汉式单例模式、饿汉式单例模式等。

这些实现方式各有优缺点,需要根据具体的应用场景和需求来选择。

懒汉式单例模式在第一次使用时才创建实例,节省了系统资源;而饿汉式单例模式在类加载时就完成了实例化,确保了多线程环境下的安全性。

无论是哪种实现方式,其核心都是确保全局只有一个实例,并且提供安全的获取方式。

同时还需要考虑线程安全和内存泄漏等问题。

单例模式的代码实现有一定的技术挑战和复杂度要求。

需要在编码过程中细心设计和考虑多种场景,以确保单例模式的正确性和可靠性。

总之单例模式在特定场景下能有效提高系统的性能和稳定性。

PHP单例模式应用场景有哪些

单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

复制代码 代码如下:<?php/* 单例模式举例,其要点如下:** 1. $_instance 必须声明为静态的私有变量* 2. 构造函数和克隆函数必须声明为私有的,这是为了防止外部程序 new 类从而失去单例模式的意义* 3. getInstance()方法必须声明为公有的,必须调用此方法以返回唯一实例的一个引用* 4. ::操作符只能访问静态变量或静态函数* 5. PHP的单例模式是相对而言的,因为PHP的解释运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。

* 也就是说,PHP在语言级别上没有办法让某个对象常驻内存。

在PHP中,所有的变量都是页面级的,无论是全局变量,* 还是类的静态成员,都会在页面执行完毕后被清空,结果会重新建立新的对象,这样也就完全失去了Singleton的意义。

* 不过,在实际应用中同一个页面中可能会存在多个业务逻辑,这时单例模式就起到了很重要的作用,有效的避免了重复* new 对象(注: new 对象会消耗内存资源)这么一个行为,所以我们说PHP的单例模式是相对而言的**/class People{static private $_instance = NULL;public $height = ;public $age = ;private function __construct(){$this->height = 185;$this->age = 25;}private function __clone(){//do something}static public function getInstance(){if(!self::$_instance instanceof self){//echo lgh-big;self::$_instance = new self;}else{//for testing only//echo gdc-xiaoairener;}return self::$_instance;}public function getHeight(){echo $this->height;}public function getAge(){echo $this->age;}}function testInstance(){People::getInstance()->getAge();}//begin to use the class$lgh = People::getInstance();$lgh->getHeight();echo <br />;testInstance();?>优点:单例模式可以避免大量的new操作,因为每一次new操作都会消耗内存资源和系统资源缺点:在PHP中,所有的变量无论是全局变量还是类的静态成员,都是 页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只 是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的。

Why–为什么要使用PHP单例模式?PHP的一个主要应用场合就是应用程序与数据库打交道的应用场景,所以一个应用中会存在大量的数据库操作,比如过数据库句柄来连接数据库这一行为,使用单例模式可以避免大量的new操作,因为每一次new操作都会消耗内存资源和系统资源。

还是有些抽象,给出代码片段。

使用传统方式编码复制代码 代码如下:<?php......//初始化一个数据库句柄$db = new DB(...);//比如有个应用场景是添加一条用户信息:$db->addUserInfo();......//然而我们在另外一个地方可能要查找用户的信息,这个情景出现在一个函数中,这时要用到数据库句柄资源,我们可能需要这么去做 test(){......//这时我们不得不重新初始化一个数据库句柄,试想多个应用场景下,这样的代码是多么可怕啊?!$db = new DB(...);$db->getUserInfo();......//有些朋友或许会说,我也可以不这样做啊,我直接利用global关键字不就可以了吗?的确,global可以解决问题,也起到了单例模式的作用,但是OOP中,我们拒绝这样来编写代码,因为global存在安全隐患,请参考相关书籍,同时单例模式恰恰是对全局变量的一种改进,避免了那些存储唯一实例的全局变量污染命名空间global $db;//OOP中,我们不提倡这样编写代码......}使用单例模式编码复制代码 代码如下:<?php......//所有的应用情景只有一个数据库句柄资源,嘿嘿,效率老高了,//资源也大大的得到节省,代码简洁明了:)DB::getInstance()->addUserInfo();DB::getInstance()->getUserInfo();–如何来编写PHP单例模式?在了解了单例模式的应用场景之后,下面我们通过编写单例模式的具体实现代码来掌握PHP单例模式的核心要点,代码如下:复制代码 代码如下:<?php/***PHP单例模式演示举例*@author *@modify2010-07-11*@websiteUser{/***静态成品变量 保存全局实例*@access private*/static private $_instance = NULL;/***私有化构造函数,防止外界实例化对象*/private function__construct() {}/***私有化克隆函数,防止外界克隆对象*/private function__clone(){}/***静态方法, 单例统一访问入口*@returnobject返回对象的唯一实例*/static public function getInstance() {if (is_null(self::$_instance) || !isset(self::$_instance)) {self::$_instance = new self();}return self::$_instance;}/*** 测试方法: 获取用户名字*/public function getName() {echo hello liguohua!;}}从以上代码中,我们总结出PHP单例模式实现的核心要点有如下三条:1.需要一个保存类的唯一实例的静态成员变量(通常为$_instance私有变量)2.构造函数和克隆函数必须声明为私有的,这是为了防止外部程序new类从而失去单例模式的意义3.必须提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一实例的一个引用PHP单例模式的缺点众所周知,PHP语言是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。

也就是说,PHP在语言级别上没有办法让某个对象常驻内存,这和、Java等编译型是不同的,比如在Java中单例会一直存在于整个应用程序的生命周期里,变量是跨页面级的,真正可以做到这个实例在应用程序生命周期中的唯一性。

然而在PHP中,所有的变量无论是全局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的。

什么是Singleton

简介:Singleton即单例模式,单例模式是一种常用的软件设计模式。

在它的核心结构中只包含一个被称为单例类的特殊类。

通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。

如果希望在系统中某个类的对象只能存在一个,单例模式是较好的解决方案。

显然单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

你可能想看:
« 上一篇
下一篇 »

相关推荐

php实时推送,php实地培训

2026年10月05日

53阅读

php乱码出现问号的原因,php乱码出现问号的原因有哪些

2026年10月05日

44阅读

php一句话木马,一句话木马ctf

2026年10月05日

48阅读

php获取数组长度,php中如何获取数组的长度

2026年10月05日

50阅读

php面试题库及答案,php程序员面试真题库

2026年10月05日

47阅读

phpcontent-type修改,php源码二次修改需要多少钱

2026年10月05日

42阅读