php实现设计模式————单例模式
  
  什么是单例模式
  
  为什么要使用单例模式
  
  php中有哪些方式实现新建一个对象实例
  
  如何阻止这种实例化实现理想的单例模式
  
  代码实现
  
  什么是单例模式
  
  为什么要使用单例模式
  
  php中有哪些方式实现新建一个对象实例
  
  1. new test();//通过new实例化对象
  
  2. 通过clone复制对象
  
  3. 通过序列化反序列化得到对象实例
  
  4. 通过类的反射实例化对象
  
  1
  
  2
  
  3
  
  4
  
  如何阻止这种实例化实现理想的单例模式
  
  1. new test();//通过new实例化对象 : 通过更改构造方法为private 阻止使用方直接new 对象
  
  3. 通过clone复制对象 : 通过定义private __clone()阻止复制操作
  
  4. 通过序列化反序列化得到对象实例 :通过定义__wakeup()阻止对象的反序列化。
  
  5. 通过类的反射实例化对象:暂时还没有相应的方法去阻止使用此方法实现对象多例
  
  1
  
  2
  
  3
  
  4
  
  代码实现
  
  <?php
  
  /**
  
  * Created by PhpStorm.
  
  * User: Uasier
  
  * Date: 2018/10/17
  
  * Time: 15:10
  
  */
  
  /**
  
  * 单例模式实例
  
  */
  
  class Singleton
  
  {
  
  /**
  
  * 私有变量存实例
  
  * @var Singleton
  
  */
  
  private static $instance;
  
  /**
  
  * 私有构造函数
  
  * Singleton constructor.
  
  */
  
  private function __construct()
  
  {
  
  var_dump('构造了对象');
  
  }
  
  /**
  
  * clone 魔术方法
  
  */
  
  private function __clone()
  
  {
  
  var_dump('复制了对象');
  
  }
  
  /**
  
  * sleep 魔术方法
  
  * @return array
  
  */
  
  public function __sleep(){
  
  //todo 如何阻止
  
  var_dump('序列化了对象');
  
  return [];
  
  }
  
  /**
  
  * wakeup 魔术方法
  
  */
  
  public function __wakeup(){
  
  //todo 如何阻止
  
  var_dump('反序列化了对象');
  
  }
  
  /**
  
  * 公有获取实例方法
  
  * @return Singleton
  
  */
  
  public static function getInstance()
  
  {
  
  if (!(self::$instance instanceof self)) {
  
  self::$instance = new self();
  
  }
  
  var_dump('返回了对象');
  
  return self::$instance;
  
  }
  
  }
  
  //*******************************单例模式测试****************************
  
  //①在Singleton没有实例的情况下获取实例
  
  $a = Singleton::getInstance();
  
  var_dump($a);
  
  //在Singleton已经有实例的情况下获取实例
  
  $b = Singleton::getInstance();
  
  var_dump($b);
  
  //②通过克隆来得到实例
  
  $c = clone $a;
  
  var_dump($c);
  
  //③通过序列化再反序列化得到实例
  
  $d = serialize($a);//序列化
  
  $e = unserialize($d);//反序列化
  
  $e->name = '反序列化';
  
  var_dump($e);
  
  //④php 反射来的到实例
  
  $obj = new ReflectionObject('Singleton');
  
  $f = $obj->newInstanceWithoutConstructor();
  
  var_dump($f);
  
  相对而言,php中四种实例对象的方式,但是我们能(合理)阻止的只有3种,
  
  如代码体现的,php的反射来获得实例是我们阻止不了的一种方式(然而java却可以),
  
  但是怎么说呢,php 的反射也不是为了让你去破解单例模式的,
  
  简而言之,我们其实不用舍本求末过分追求单例模式的完美性,毕竟实现单例模式的是程序员,使用单例模式的也是程序员。程序
  
  复制代码
  
  1 using System;
  
  2 using System.Threading.Tasks;
  
  3
  
  4 using Quartz;
  
  5 using Quartz.Impl;
  
  6 using Quartz.Logging;
  
  7
  
  8 namespace QuartzSampleApp
  
  9 {
  
  10 public class Program
  
  11 {
  
  12 private static void Main(string[] args)
  
  13 {
  
  14 LogProvider.SetCurrentLogProvider(new ConsoleLogProvider());
  
  15
  
  16 RunProgram(www.gcyl159.com).GetAwaiter().GetResult();
  
  17
  
  18 Console.WriteLine("Press any key to close the application");
  
  19 Console.ReadKey(www.gcyl152.com/ );
  
  20 }
  
  21
  
  22 private static async Task RunProgram()
  
  23 {
  
  24 try
  
  25 {
  
  26 // Grab the Scheduler instance from the Factory
  
  27 NameValueCollection props =www.michenggw.com new NameValueCollection
  
  28 {
  
  29 { "quartz.serializer.type", "binary" }
  
  30 };
  
  31 StdSchedulerFactory factory = new StdSchedulerFactory(props);
  
  32 IScheduler scheduler = await factory.GetScheduler();
  
  33
  
  34 // and start it off
  
  35 await scheduler.Start();
  
  36
  
  37 // define the job and tie it to our HelloJob class
  
  38 IJobDetail job = JobBuilder.Create<HelloJob>(www.yigouyule2.cn)
  
  39 .WithIdentity("job1", "group1")
  
  40 .Build();
  
  41
  
  42 // Trigger the job to run now, and then repeat every 10 seconds
  
  43 ITrigger trigger = TriggerBuilder.Create()
  
  44 .WithIdentity("trigger1", "group1")
  
  45 .StartNow()
  
  46 .WithSimpleSchedule(x => x
  
  47 .WithIntervalInSeconds(10)
  
  48 .RepeatForever(www.leyouzaixian2.com))
  
  49 .Build(www.365soke.com);
  
  50
  
  51 // Tell quartz to schedule the job using our trigger
  
  52 await scheduler.ScheduleJob(job, trigger);
  
  53
  
  54 // some sleep to show what's happening
  
  55 await Task.Delay(TimeSpan.FromSeconds(60));
  
  56
  
  57 // and last shut down the scheduler when you are ready to close your program
  
  58 await scheduler.Shutdown();
  
  59 }
  
  60 catch (SchedulerException se)
  
  61 {
  
  62 Console.WriteLine(se);
  
  63 }
  
  64 }
  
  65
  
  66 // simple log provider to get something to the console
  
  67 private class ConsoleLogProvider : ILogProvider
  
  68 {
  
  69 public Logger GetLogger(string name)
  
  70 {
  
  71 return (level, func, exception, parameters) =>
  
  72 {
  
  73 if (level >= LogLevel.Info && func != null)
  
  74 {
  
  75 Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] [" + level + "] " + func(), parameters);
  
  76 }
  
  77 return true;
  
  78 };
  
  79 }
  
  80
  
  81 public IDisposable OpenNestedContext(string message)
  
  82 {
  
  83 throw new NotImplementedException();
  
  84 }
  
  85
  
  86 public IDisposable OpenMappedContext(string key, string value)
  
  87 {
  
  88 throw new NotImplementedException();
  
  89 }
  
  90 }
  
  91 }
  
  92
  
  93 public class HelloJob : IJob
  
  94 {
  
  95 public async Task Execute(IJobExecutionContext context)
  
  96 {
  
  97 await Console.Out.WriteLineAsync("Greetings from HelloJob!");
  
  98 }
  
  99 }
  
  100 }
  
  复制代码

php实现设计模式————单例模式的更多相关文章

  1. 设计模式 单例模式(Singleton) [ 转载2 ]

    设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...

  2. 设计模式 单例模式(Singleton) [ 转载 ]

    设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创 ...

  3. c#设计模式-单例模式(面试题)

    c#设计模式-单例模式 单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题, public class Singleton { private static Singleto ...

  4. java设计模式单例模式 ----懒汉式与饿汉式的区别

    常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...

  5. 最简单的设计模式——单例模式的演进和推荐写法(Java 版)

    前言 如下是之前总结的 C++ 版的:软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的. 概念不多说,没意思,我自己总结就是: ...

  6. ES6教程-字符串,函数的参数,了解函数的arguments对象,js面向对象,设计模式-单例模式,解构赋值

    前言 主要讲解了ES6对字符串的拓展,包括includes,startsWith和endsWith,另外增加了字符串模板. Start includes()是否包含 startsWith()以什么开头 ...

  7. Java设计模式の单例模式

    -------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱 ...

  8. java设计模式——单例模式(一)

    一. 定义与类型 定义:保证一个类仅有一个实例,并提供一个全局访问点 类型:创建型 二. 适用场景 想确保任何情况下都绝对只用一个实例 三. 优缺点 优点: 在内存里只有一个实例,减少了内存开销 可以 ...

  9. JAVA设计模式-单例模式(Singleton)线程安全与效率

    一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...

随机推荐

  1. XON/OFF

    #define XON 0x11#define XOFF 0x13查找ASCII码表,这两个对应的是DC1(设备控制1)和DC3(设备控制3) X/ON和X/OFF为开启和关闭发送器的信号.X /ON ...

  2. 启动hadoop时报root@localhost's password: localhost: Permission denied, please try again.错误。

    背景:在装完hadoop及jdk之后,在执行start-all.sh的时候出现root@localhost's password:localhost:permission denied,please ...

  3. ag-grid-vue的 行默认选中

    that.$nextTick(() => { that.gridListOptions.api.onGroupExpandedOrCollapsed(); that.$nextTick(() = ...

  4. Linux 从源码编译安装 Nginx

    Nginx 是一个高性能的 HTTP 和 反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器.Nginx 编译安装比较简单,难点在于配置.下面是 Nignx 0.8.54 编译安装和简 ...

  5. PMP项目管理学习笔记(7)——整合管理之指导和管理项目执行过程

    过程剖析 输入:组织过程资产.企业环境要素.项目管理计划.批准的变更请求 工具:专家判断.项目管理信息系统 输出:工作绩效信息.可交付成果.变更请求.项目文档和计划更新 指导和管理项目执行过程包括: ...

  6. 将Chrome调试器里的JavaScript变量保存成本地JSON文件

    我写了一个系列的文章,主要用来搜集一些供程序员使用的小工具,小技巧,帮助大家提高工作效率. 推荐一个功能强大的文件搜索工具SearchMyFiles 介绍一个好用的免费流程图和UML绘制软件-Diag ...

  7. Java从入门到放弃18---Map集合/HashMap/LinkedHashMap/TreeMap/集合嵌套/Collections工具类常用方法

    Java从入门到放弃18—Map集合/HashMap/LinkedHashMap/TreeMap/集合嵌套/Collections工具类常用方法01 Map集合Map集合处理键值映射关系的数据为了方便 ...

  8. XtraBackUp 热备份工具

    是一款强大的在线热备份工具 备份的过程中,不锁表 使用percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm yum源安装: 1.安装Percona的库:       ...

  9. 聊天室(C++客户端+Pyhton服务器)2.基本功能添加

    根据之前的框架添加新的功能 登录 点击相关按钮 // 登录按钮的响应void CMainDialog::OnBnClickedLogin(){ // 1. 获取用户输入的数据 UpdateData(T ...

  10. Linux-RedHat7.2 使用CentOS源

    -- 查看yum rpm -qa |grep yum --卸载yum rpm -qa | grep yum | xargs rpm -e --nodeps --拷贝centos系统yum工具安装程序到 ...