php设计模式之单例实例代码

<?php
header("Content-type:text/html;charset=utf-8");

/**
* 第一步,分别实例化
*/
/*class Single
{
    function __construct()
    {
        # code...
    }
}

$s1 = new Single();
$s2 = new Single();
if ($s1 === $s2) {
    echo "是同一个对象";
}else{
    echo "不是同一个对象";
}
// 不是同一个对象
*/

/**
* 第二步,封闭new实例化
*/
/*class Single
{
    protected function __construct()
    {
        # code...
    }
}

$s1 = new Single();
$s2 = new Single();
if ($s1 === $s2) {
    echo "是同一个对象";
}else{
    echo "不是同一个对象";
}
*/

/**
* 第三步,留个接口new实例化
*/
/*class Single
{
    public function getInc(){
        return new self();
    }

    protected function __construct()
    {
        # code...
    }
}

$s1 = Single::getInc();
$s2 = Single::getInc();
if ($s1 === $s2) {
    echo "是同一个对象";
}else{
    echo "不是同一个对象";
}
*/

/**
* 第四步,先判断是否实例化,再决定是否需要new实例化
*/
/*class Single
{
    static $inc = null;
    public function getInc(){
        if (self::$inc === null) {
            self::$inc = new self();
        }
        return self::$inc;
    }

    protected function __construct()
    {
        # code...
    }
}

$s1 = Single::getInc();
$s2 = Single::getInc();
if ($s1 === $s2) {
    echo "是同一个对象";
}else{
    echo "不是同一个对象";
}*/

/**
* Multi
*/
/*class Multi extends Single
{

    function __construct()
    {
        # code...
    }
}
echo "<br>";
$s1 = new Multi();
$s2 = new Multi();
if ($s1 === $s2) {
    echo "是同一个对象";
}else{
    echo "不是同一个对象";
}*/

/**
* 第五步,封闭构造函数,不让继承到,使用final关键字
*/
/*class Single
{
    static $inc = null;
    public function getInc(){
        if (self::$inc === null) {
            self::$inc = new self();
        }
        return self::$inc;
    }

    final protected function __construct()
    {
        # code...
    }
}

$s1 = Single::getInc();
$s2 = Single::getInc();
if ($s1 === $s2) {
    echo "是同一个对象";
}else{
    echo "不是同一个对象";
}*/

/**
* Multi
*/
/*class Multi extends Single
{

    function __construct()
    {
        # code...
    }
}*/
echo "<br>";

// $s1 = new Multi();
// $s2 = new Multi();

/*
$s1 = Single::getInc();
$s2 = clone $s1;

if ($s1 === $s2) {
    echo "是同一个对象";
}else{
    echo "不是同一个对象";
}
echo "<br>";
echo "<br>";*/

/**
* 第六步,禁止clone
*
**/
class Single
{
    static $inc = null;
    public function getInc(){
        if (self::$inc === null) {
            self::$inc = new self();
        }
        return self::$inc;
    }

    final protected function __construct()
    {
        # code...
    }
    final protected function __clone(){

    }
}

echo "<br>";

$s1 = Single::getInc();
$s2 = clone $s1;

if ($s1 === $s2) {
    echo "是同一个对象";
}else{
    echo "不是同一个对象";
}
echo "<br>";
echo "<br>";

原文地址:https://www.cnblogs.com/Mishell/p/12181349.html

时间: 2024-11-05 22:02:47

php设计模式之单例实例代码的相关文章

设计模式 之 单例

单例模式(Singleton Pattern) 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 最近一直在用VB.NET重构机房收费系统,在重构中就出现了一个这样的问题: 每点击一次充值的菜单,都会出现一个新的充值窗体.我就希望它要么不出现,出现也只出现一个.这个就和我们今天讲的单例模式有关系了. 大家都知道,世界上的所有事物都是独一无二的,也就是说没有哪两个事物是完全相同的.从这个角度来讲,每一个事物相对于自身都是单例的.我们今天所讲的单例设计模式则有所区别,它是针对某一类事物来说,只

设计模式总纲——单例设计模式

前两天写了设计模式总纲,今天就来讲讲我们在工程代码中最最最常用的设计模式了——单例设计模式,这个模式在工程代码上的出现率几乎为99.99999%,但是虽然很常用,但是用的好的人却不多,今天我们就来深入的说一说单例设计模式. 在学习一项新的知识之前,我们都要向自己提出三个问题,为什么要用这个知识,这个知识用在哪里,这个知识怎么用?既 why,where,how,3W模式,我们先来谈谈为什么需要单例设计模式,先来想想,如果一个工具类,比如一个读取配置文件的工具类,这类工具只是特定的功能类,既读取指定

java软件设计模式只单例设计模式

概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的:设计模式使代码编制真正工程化:设计模式是软件工程的基石脉络,如同大厦的结构一样. 设计模式分为三种类型,共23种.创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式.结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.

OC中的单例设计模式及单例的宏抽取

1 // 在一个对象需要重复使用,并且很频繁时,可以对对象使用单例设计模式 2 // 单例的设计其实就是多alloc内部的allocWithZone下手,重写该方法 3 4 #pragma Person.h文件 5 6 #import <Foundation/Foundation.h> 7 @interface Person : NSObject <NSCopying,NSMutableCopying> 8 + (instancetype)sharePerson; // 给类提供一

iOS 设计模式之单例

设计模式:单例 一.  单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案. 单例模式的要点有三个:一是某个类只能有一个实例,二是它必须自行创建这个实例,三是它必须自行向整个系统提供这个实例. 二.单例模式结构图: 三. 单例的好处: 1.实例控制:单例模式会阻止其他对象实例化其自己的单例对象

设计模式:单例设计模式

单例设计模式 由于某些类创建对象可能会耗费内存和花费时间.一般将这种类设计为单例设计模式会比较好. 1.对象在内存中只有一个,减少了内存的开销 2.可以控制对象的创建时刻 单例模式的特点: 1.单例的类在整个JVM中只有一个实例 2.需要提供一个全局访问点(1.公开的静态变量,2.公开的静态方法) 1.饿汉式: 特点:类加载的时候就创建了实例 //饿汉式 /* *1.类能被创建且只有一个实例 * 2.提供一个全局的访问点 * */ public class Singleton { //创建唯一的

java设计模式之单例设计模式

设计模式:解决某一类问题最行之有效的方法. java中23种设计模式. 单例设计模式:解决一类在内存中只存在一个对象. Runtime()方法就是单例设计模式进行设计的. 解决的问题:保证一个类在内存中的对象唯一性. 比如:多程序读取一个配置文件时,建议配置文件封装成对象.会方便操作其中数据,又要保证多个程序读到的是同一个配置文件对象,就需要该配置文件对象在内存中是唯一的. 1.为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象. 2.还为了让其他程序可以访问该类对象,只好在本类中自定

设计模式之-----------单例设计模式

饿汉式: class Single { //   提前做好! private static final Single s = new Single(); //  私有化 构造函数  无法使用new 创建对象! private Single(){} //  对外提供接口 public static Single getInstance() { return s; } } 懒汉式: 懒汉 顾名思义  就是懒呗 什么时候用到 什么时候创建! class Single1 { private static

正则表达式表单验证实例代码详解

正则表达式表单验证实例代码详解 这篇文章主要介绍了正则表达式表单验证实例详解的相关资料,大家可以参考下.正则表达式表单验证具体内容如下: 首先给大家解释一些符号相关的意义 * 匹配前面的子表达式零次或多次: ^ 匹配输入字符串的开始位置:$匹配输入字符串的结束位置 1. /^$/ 这个是个通用的格式. 2. 里面输入需要实现的功能. \d 匹配一个数字字符,等价于[0-9] + 匹配前面的子表达式一次或多次: ?匹配前面的子表达式零次或一次: 下面通过一段代码给大家分析表单验证正则表达式,具体代