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. B. Code For 1 一个类似于线段树的东西

    http://codeforces.com/contest/768/problem/B 我的做法是,观察到,只有是x % 2的情况下,才有可能出现0 其他的,都是1来的,所以开始的ans应该是R - ...

  2. 使用VMwaver 克隆CentOS 6.9网卡配置报错

    报错信息: 克隆完成之后,使用的是NAT模式,进入系统之后有IP地址也可以ping外网,但是没有ifcfg-eth0这个文件,使用setup命令配置网卡时报以下错误: 待解决-

  3. scrollTop、offsetTop、clientTop

    1.offsetTop: obj.offsetTop 指 obj 相对于版面或由 offsetParent 属性指定的父坐标的计算上侧位置. 2.clientTop: 这个返回的是元素周围边框的厚度, ...

  4. 02html基础

    02_html 1.几个标签 1.1 meta标签 meta标签的属性有name和http-equiv,其中name属性用于描述网页,对应于content(网页内容). <meta name=& ...

  5. android控件之webview和js与java交互

    首先添加权限:<uses-permission android:name="android.permission.INTERNET"/> 布局文件: <Relat ...

  6. [Java 8] (8) Lambda表达式对递归的优化(上) - 使用尾递归 .

    递归优化 很多算法都依赖于递归,典型的比如分治法(Divide-and-Conquer).但是普通的递归算法在处理规模较大的问题时,常常会出现StackOverflowError.处理这个问题,我们可 ...

  7. 洛谷 P2604 [ZJOI2010]网络扩容

    题目描述 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的最小扩容费用. ...

  8. Mybatis-Generator逆向生成Po,Mapper,XMLMAPPER(一)

    这个地方的生成需要用到三个文件,generatorConfig.xml.mybatis-generator-core-1.3.1.jar和mysql-connector-java-5.1.29.jar ...

  9. linux之awk命令

    一.awk的内置参数 $0:表示整个当前行 $1:每行第一个字段 $2:每行第二个字段 $n:每行第n个字段 awk的参数:分隔符 -F separator 设定分隔符(默认为空格) 打印单个字段: ...

  10. 普通用户切换到root用户

    普通用户切换到root用户首先按组合键 CTRL+ALT+T 进入终端界面,一般终端界面默认为普通用户权限模式,如何从普通用户进入root用户首先重置root密码输入 sudo passwd root ...