【PHP设计模式 05_DanLi.php】单例模式
<?php /** * 【单例模式】 * 总结:防止外部new对象;防止子类继承;防止克隆。 */ header("Content-type: text/html; charset=utf-8"); /******* NO.1 普通的可以调用的类 ******/ //先定义一个类,实例化两次,看看是否全等(===) class sigleA{ } $sa1 = new sigleA(); $sa2 = new sigleA(); //注意:当两个对象是一个的时候,才会全等 //此处输出 “sa-不是一个对象” if($sa1 === $sa2){ echo 'sa-是一个对象<br>'; }else{ echo 'sa-不是一个对象<br>'; } /********************* NO.2 封锁new操作 ********************/ //getIns 预先判断实例 class sigleB{ protected static $ins = null; public static function getIns(){ //getIns 获取实例 if(self::$ins === null){ //把【自身对象】 赋给 一个自己的 【静态属性】 self::$ins = new self(); } return self::$ins; } //保护的 构造函数 protected function __construct(){ } } //再去判断两个对象 $sb1 = sigleB::getIns(); $sb2 = sigleB::getIns(); //此处输出 “sb-是一个对象” if($sb1 === $sb2){ echo 'sb-是一个对象<br>'; }else{ echo 'sb-不是一个对象<br>'; } ////----- 但是,下面用一个新的类继承自上面的 sigleB ... class multi extends sigleB{ public function __construct(){ } } $m1 = new multi(); $m2 = new multi(); //此处输出 “m-不是一个对象”,原因在于被继承后,__construct 被公开了 if($m1 === $m2){ echo 'm-是一个对象<br>'; }else{ echo 'm-不是一个对象<br>'; } /********************* NO.3 final防止继承 ********************/ class sigleC{ protected static $ins = null; public static function getIns(){ if(self::$ins === null){ self::$ins = new self(); } return self::$ins; } //若方法前加上final,则方法不能被覆盖; //若类前加上final,则类不能被继承 final protected function __construct(){ } //同样的,防止克隆(clone) final protected function __clone(){ } } $sc1 = sigleC::getIns(); $sc2 = clone $sc1; //被克隆了,又产生了多个对象; //如果没加上 防止克隆的代码,此处输出 “sc-不是一个对象” //上面加上了 final protected function __clone(),这里就会出错: //Fatal error: Call to protected sigleC::__clone() from context '' in ... if($sc1 === $sc2){ echo 'sc-是一个对象<br>'; }else{ echo 'sc-不是一个对象<br>'; }
【PHP设计模式 05_DanLi.php】单例模式的更多相关文章
- 【白话设计模式四】单例模式(Singleton)
转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...
- php设计模式笔记:单例模式
php设计模式笔记:单例模式 意图: 保证一个类仅有一个实例,并且提供一个全局访问点 单例模式有三个特点: 1.一个类只有一个实例2.它必须自行创建这个实例3.必须自行向整个系统提供这个实例 主要实现 ...
- Java设计模式之《单例模式》及应用场景
摘要: 原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6510196.html 所谓单例,指的就是单实例,有且仅有一个类实例,这个单例不应该 ...
- Java设计模式之【单例模式】
Java设计模式之[单例模式] 何为单例 在应用的生存周期中,一个类的实例有且仅有一个 当在一些业务中需要规定某个类的实例有且仅有一个时,就可以用单例模式 比如spring容器默认初始化的实例就是单例 ...
- Java设计模式中的单例模式
有时候在实际项目的开发中,我们会碰到这样一种情况,该类只允许存在一个实例化的对象,不允许存在一个以上的实例化对象,我们将这种情况称为Java设计模式中的单例模式.设计单例模式主要采用了Java的pri ...
- C#设计模式学习笔记-单例模式随笔
最近学习 设计模式,从单例模式入手 啥是单例模式: 要实现一个单例类的话,首先,肯定是不能让用户自行生产的,那就是说明不能让用户new,所以,就必须把构造函数设置成为私有的 因为静态变量的生命周期跟整 ...
- IOS设计模式浅析之单例模式(Singleton)
说在前面 进入正式的设计模式交流之前,扯点闲话.我们在项目开发的过程中,经常会不经意的使用一些常见的设计模式,如单例模式.工厂方法模式.观察者模式等,以前做.NET开发的时候,认真拜读了一下程杰老师的 ...
- C#设计模式学习笔记-单例模式(转)
C#设计模式学习笔记-单例模式 http://www.cnblogs.com/xun126/archive/2011/03/09/1970807.html 最近在学设计模式,学到创建型模式的时候,碰到 ...
- PHP 面向对象编程和设计模式 (3/5) - 单例模式和工厂模式
PHP高级程序设计 学习笔记 2014.06.11 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容 ...
随机推荐
- sqlserver 2000事务复制问题
2000现在用的估计不多了,把之前收集的一些复制问题整理发布出来.可能都是些很白很二的问题,但人总是由最初的无知不断成长,不对之处欢迎指正. sqlserver 2000事务复制问题服务器A(发布) ...
- 逻辑卷管理LVM (Logical Volume Manager)
什么是LVM? LVM(Logical Volume Manager)逻辑卷管理,是一种将一个或多个硬盘的分区在逻辑上集合,相当于一个大硬盘来使用,当硬盘的空间不够使用的时候,可以继续将其它的硬盘的 ...
- C# WebApi传参之Post请求-AJAX
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷. 学无止境,精益求精 上一节讲述了C# WebApi传参之Get请求 ...
- EF Code First DataAnnotations
Key EF框架要求每个实体必须有主键字段,他需要根据这个主键字段跟踪实体.CodeFirst方法在创建实体时,也必须指定主键字段,默认情况下属性被命名为ID.id或者[ClassName]Id,将映 ...
- Java基础之泛型——使用泛型链表类型(TryGenericLinkedList)
控制台程序 定义Point类: public class Point { // Create a point from its coordinates public Point(double xVal ...
- linux:磁碟与档案系统管理
档案系统特性:为什么磁碟分割完需要格式化(format)才能使用吗? 答:因为每种作业系统所设定的档案属性和权限并不相同,为了存放这些档案所需的资料(所以需要格式化成作业系统能够利用的档案系统格式fi ...
- Java数据类型和对象的引用
在Java中,变量分为两类: 1.基本类型变量,java是传递的副本 2.一切对象型变量,传引用副本的实质是复制指向地址的指针 a.基本类型引用 public class BasicTransmit ...
- linux_x86_64 blat安装
blatSrc35.zip下载地址:http://users.soe.ucsc.edu/~kent/src/ 对于下载好的源代码安装包blatSrc35.zip,需进行编译,安装过程如下: 1.用un ...
- Lintcode: Segment Tree Build
The structure of Segment Tree is a binary tree which each node has two attributes start and end deno ...
- Mac系统下控制鼠标移动
CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState); CGEventRef m ...