一个类只有一个实例对象

1、含义

  作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局的提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。

2、单例模式的三个要点

  1)、一个类的唯一实例的静态成员变量:

  private static $instance;

  2)、构造函数和克隆函数必须声明为私有的,防止外部程序new类从而失去单例模式的意义:

  private function __construct()

  {

  }

  private function __clone()

  {

  }

  3)、必须提供提供一个访问这个实例的公共的静态方法(一般为getInstance方法),从而返回唯一实例的一个引用:

  public static function getInstance()

  {

    if (static::$instance == null)   //或者 if (!(self::$_instance instanceof self))

    {

      static::$instance == new Self();

    }

    return static::$instance;

   }

测试demo:

  <?php

  class Singleton

  {

    private static $instance;

    private function __construct(){}

    public static function getInstance()

    {

      if (static::$instance == null)

      {

        static::$instance == new Singleton();

      }

        return static::$instance;

    }

  }

//客户端代码

  $s1 = Singleton::getInstance();

  $s2 = Singleton::getInstance();

  if ($s1 == $2)

  {

    echo "same class";

  }

总结:

  单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。使用单例模式可以避免大量的new操作,因为每一次new操作都会消耗系统和内存的资源。

  单例模式因为Singleton类封装它的唯一实例,这样它可以严格的控制客户怎样访问以及何时访问它,简单来说就是对唯一实例的受控访问。

  

PHP 面向对象之单例模式-有些类也需要计划生育的更多相关文章

  1. [.net 面向对象编程基础] (9) 类和类的实例

    [.net 面向对象编程基础] (9) 类和类的实例 类 ,顾名思义就是分类.类别的意思.我们要面向对象编程,就需要对不同的事物进行分类.类可以说是.net面向对象的核心. 类:就是具有相同的属性和功 ...

  2. [.net 面向对象编程基础] (10) 类的成员(字段、属性、方法)

    [.net 面向对象编程基础] (10) 类的成员(字段.属性.方法) 前面定义的Person的类,里面的成员包括:字段.属性.方法.事件等,此外,前面说的嵌套类也是类的成员. a.类的成员为分:静态 ...

  3. Lua面向对象之二:类继承

    1.类继承 ①代码 Sharp = { } --① 父类 function Sharp:new() local new_sharp = { } self.__index = self --②,self ...

  4. js面向对象设计之class类

    class 相对 function 是后出来的,既然 class 出来了,显然是为了解决 function 在处理面向对象设计中的缺陷而来.下面通过对比,来看看 class 作为 ES6 中的重大升级 ...

  5. js面向对象设计之function类

    本文仅探讨如何合理的使用 function 在 javascript中实现一个面向对象设计的类.总所周知,javascript 并不能实现一个真正意义上的类,比如 protect 比如 函数重载.下面 ...

  6. python面向对象的特点,类定义等,私有属性、公有属性、成员属性

    引子:类的对象在内存中的表示def dog(name,dog_type): def bark(d): print(d,'wang wang wang ...') data = { 'name':nam ...

  7. 《挑战30天C++入门极限》C++面向对象编程入门:类(class)

        C++面向对象编程入门:类(class) 上两篇内容我们着重说了结构体相关知识的操作. 以后的内容我们将逐步完全以c++作为主体了,这也意味着我们的教程正式进入面向对象的编程了. 前面的教程我 ...

  8. Python:面向对象编程3 定制类(有更新)

    Python:面向对象编程3  定制类(有更新) ⚠️本文主要内容为对Data model相关知识点的提取学习记录.(内容来自文档和部分网页教程案例) ⚠️:这个连接指向<流畅的python&g ...

  9. day22:面向对象封装对象操作&类操作&面向对象删除操作

    面向对象程序开发 1.类的三种定义方式 class MyClass: pass class MyClass(): #(推荐) pass class MyClass(object): # object类 ...

随机推荐

  1. gitLib操作笔录《一》:创建分支,切换分支,提交分支到远程,以及基本代码clone与更新提交到远程操作指令

    git 操作经验注:master表示的是主线,origin 表示远程源 创建分支:git checkout -b < branch_name >或 < master >切换分支 ...

  2. Linux中Hadoop的环境搭建

    一:下载安装 Hadoop 1.1:下载指定的Hadoop 1.2:通过XFTP把文件上传到master电脑bigData目录下 1.3:解压hadoop压缩文件 tar -xvf hadoop-2. ...

  3. request请求携带证书,如:微信企业零钱付款

    const Promise = require('bluebird') const request = Promise.promisifyAll(require('request')) const w ...

  4. mysql查询用,或#隔开的字段

    假如,user表有一字段 pids,pids字段是用#(实际用逗号合适)隔开的师傅id.现在查询师傅id:168的徒弟有哪些(徒弟.徒孙.徒孙的徒弟.徒孙的徒孙....) sql:  select * ...

  5. (55)Wangdao.com第八天_JavaScript 字符串中使用 \u 输出Unicode字符

    JavaScript中,使用Unicode 需要 \u 进行转义,格式 "\u十六进制" console.log(\u0031); console.log(\u0041); // ...

  6. STL--set_difference

    set_difference(),作用是求两个集合的差.即求A-B(属于A但不属于B的元素) set_difference()算法计算两个集合[start1, end1)和[start2, end2) ...

  7. hook NtTerminateProcess进行应用的保护

    这段时间在学习驱动,然后看到hook ssdt的代码,找了一个写的清晰的学习了一下:http://www.netfairy.net/?post=218 这里是hook NtOpenProcess,但是 ...

  8. css-不固定宽高定位

    position: fixed; top:50%; left: 50%; transform: translate(-50%, -50%);

  9. 解决国内NPM安装依赖速度慢问题

      版权声明:本文为博主原创文章,转载请注明原文地址. http://blog.csdn.net/rongbo_j/article/details/52106580 不知道各位是否遇到这种情况,使用N ...

  10. JDK8之The type java.util.Map$Entry cannot be resolved

    eclipse+tomcat7+jdk1.6上面报错的方式我的解法方法是吧jre8换成6的就好了选中项目->右键->java build path ->找到jre system li ...