<?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】单例模式的更多相关文章

  1. 【白话设计模式四】单例模式(Singleton)

    转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...

  2. php设计模式笔记:单例模式

    php设计模式笔记:单例模式 意图: 保证一个类仅有一个实例,并且提供一个全局访问点 单例模式有三个特点: 1.一个类只有一个实例2.它必须自行创建这个实例3.必须自行向整个系统提供这个实例 主要实现 ...

  3. Java设计模式之《单例模式》及应用场景

    摘要: 原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6510196.html 所谓单例,指的就是单实例,有且仅有一个类实例,这个单例不应该 ...

  4. Java设计模式之【单例模式】

    Java设计模式之[单例模式] 何为单例 在应用的生存周期中,一个类的实例有且仅有一个 当在一些业务中需要规定某个类的实例有且仅有一个时,就可以用单例模式 比如spring容器默认初始化的实例就是单例 ...

  5. Java设计模式中的单例模式

    有时候在实际项目的开发中,我们会碰到这样一种情况,该类只允许存在一个实例化的对象,不允许存在一个以上的实例化对象,我们将这种情况称为Java设计模式中的单例模式.设计单例模式主要采用了Java的pri ...

  6. C#设计模式学习笔记-单例模式随笔

    最近学习 设计模式,从单例模式入手 啥是单例模式: 要实现一个单例类的话,首先,肯定是不能让用户自行生产的,那就是说明不能让用户new,所以,就必须把构造函数设置成为私有的 因为静态变量的生命周期跟整 ...

  7. IOS设计模式浅析之单例模式(Singleton)

    说在前面 进入正式的设计模式交流之前,扯点闲话.我们在项目开发的过程中,经常会不经意的使用一些常见的设计模式,如单例模式.工厂方法模式.观察者模式等,以前做.NET开发的时候,认真拜读了一下程杰老师的 ...

  8. C#设计模式学习笔记-单例模式(转)

    C#设计模式学习笔记-单例模式 http://www.cnblogs.com/xun126/archive/2011/03/09/1970807.html 最近在学设计模式,学到创建型模式的时候,碰到 ...

  9. PHP 面向对象编程和设计模式 (3/5) - 单例模式和工厂模式

    PHP高级程序设计 学习笔记 2014.06.11 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容 ...

随机推荐

  1. Power-BI:从5方面助力您企业的发展

    商务智能让企业得以使用自己的数据来预测销量趋势.分析ROI.追踪收益.做出更明智的产品和服务决策.商务智能可从5个方面让您成为“数据之星”,为您发展企业: 1.关注企业成长.而非数据 优质的BI工具最 ...

  2. activity传值到fragment

    1,初始化fragment时候: @Override public void onAttach(Activity activity) { /** 注册广播 */  initBroadcast(); s ...

  3. Android --SwipeRefreshLayout 下拉刷新

    1.Layout <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/id_swipe_ly" an ...

  4. iOS UILabel根据文字获取高度及UITableCell动态获取高度(以截取快递信息为例)

    #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...

  5. iTOP-4412 平台基础软件的安装和学习

    这两天在电脑上根据开发手册安装了超级终端.虚拟机.Ubuntu.以及Vim 编辑器等开发所必备的环境 1.笔记本没有串口,从实验室找了USB 转串口线来连接开发板和PC,从网盘找到并安装了USB 转串 ...

  6. Java基础之写文件——缓冲区中的多条记录(PrimesToFile3)

    控制台程序,上一条博文(PrimesToFile2)每次将一个素数写入到文件中,所以效率不是很高.最好是使用更大的缓冲区并加载多个素数. 本例重复使用三个不同的视图缓冲区加载字节缓冲区并尽可能加入更多 ...

  7. 一步一步学习Swift之(一):关于swift与开发环境配置

    一.什么是Swift? 1.Swift 是一种新的编程语言,用于编写 iOS 和 OS X 应用. 2.Swift 结合了 C 和 Objective-C 的优点并且不受 C 兼容性的限制. 3.Sw ...

  8. 背包九讲 附:USACO中的背包问题

    附:USACO中的背包问题 USACO是USA Computing Olympiad的简称,它组织了很多面向全球的计算机竞赛活动. USACO Trainng是一个很适合初学者的题库,我认为它的特色是 ...

  9. zjuoj 3610 Yet Another Story of Rock-paper-scissors

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3610 Yet Another Story of Rock-paper-sc ...

  10. bzoj 4358 permu

    比较容易想到莫队算法+线段树,但是这样时间复杂度是O(nsqrtnlogn)无法通过,考虑如果不进行删除操作,只有添加操作的话那么并查集就可以实现了,于是可以设定sqrtn块,每个块范围为(i-1)* ...