singleton是怎样的模式 (single是什么意思啊)
本文目录导航:
singleton是怎样的模式?
Singleton(单例)模式是一种常用的软件设计模式,它属于创建型模式,主要目的是确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。
Singleton模式在多线程环境中尤其有用,因为它可以保证在系统中无论何时何地,都只有一个实例存在,从而避免了资源的重复创建和不必要的消耗。
**Singleton模式的实现要点包括:**1. **私有构造函数**:为了防止其他类实例化Singleton类,其构造函数被声明为私有。
2. **静态实例变量**:Singleton类包含一个静态变量,用于存储唯一实例。
这个静态变量在Singleton类的内部初始化。
3. **公共的静态方法**:Singleton类提供一个公共的静态方法,通常命名为`getInstance()`,用于返回Singleton实例。
如果实例尚未创建,`getInstance()`方法将创建一个新实例;如果实例已经存在,它将直接返回该实例。
4. **线程安全**:在多线程环境中,需要确保`getInstance()`方法是线程安全的,即在并发访问下,Singleton模式仍然能确保只创建一个实例。
这通常通过同步机制(如synchronized关键字)实现,但需要注意的是,过度使用同步可能会降低性能,因此有时候会使用双重检查锁定(Double-Checked Locking)等技术来优化。
**Singleton模式的优点:**- 确保系统中一个类只有一个实例,节省内存资源。
- 全局访问点,简化了对实例的访问。
- 对于频繁使用的对象,可以省去创建新实例的时间,提高性能。
**Singleton模式的缺点:**- 单例模式会隐藏类的实例化,这可能会给测试带来困难,因为单例对象很难被模拟或替换。
- 过度使用单例模式可能会导致代码结构的不清晰,降低代码的可维护性和可扩展性。
- 单例模式的静态特性与Java的序列化机制不兼容,如果不妥善处理,序列化可能会导致单例模式失效。
在使用Singleton模式时,应根据具体的应用场景和需求来权衡其优缺点,避免滥用。
同时,现代软件设计中也出现了很多替代或改进单例模式的技术,如依赖注入(DI)框架等,它们提供了更灵活、更可测试的解决方案。

单例设计模式具备哪些特点
单例设计模式具备的特点有:1、私有化的构造函数;2、私有的静态的全局变量;3、公有的静态的方法。
单例模式,是一种常用的软件设计模式。
在它的核心结构中只包含一个被称为单例的特殊类。
通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。
即一个类只有一个对象实例。
单例模式是设计模式中最简单的形式之一。
这一模式的目的是使得类的一个对象成为系统中的唯一实例。
要实现这一点,可以从客户端对其进行实例化开始。
因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。
使用工厂方法来限制实例化过程。
这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。
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单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的。