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. apt-get的一些坑

    apt-get update:更新安装列表apt-get upgrade:升级软件apt-get install software_name :安装软件apt-get --purge remove  ...

  2. 简要记录下localStorage在项目中的应用之一

    localStorage作为HTML5本地存储web storage特性的API之一,主要作用是将数据保存在客户端中.localStorage保存的数据,一般情况下是永久保存的,也就是说只要采用loc ...

  3. 洛谷P2765 魔术球问题(贪心 最大流)

    题意 已经很简洁了吧. 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全 ...

  4. CSS预处理less基本使用

    中文API http://lesscss.cn   变量 @变量名:变量值   @maincolor:#aeeeee; @acolor:#ffffff; @ht200:200px; @ht50:50p ...

  5. (4)《Head First HTML与CSS》学习笔记---文本的CSS规则和盒模型;div与span;<a>元素的链接色;伪类

    1.每个font-family包含一组共同特征的字体.共五个字体系列: sans-serif----这个系列包括了没有衬线的字体,与serif相比,通常认为这个系列更容易在计算机上识读. serif- ...

  6. java nio 读取大文件

    package com.yao.bigfile; import java.io.File; import java.io.IOException; import java.io.RandomAcces ...

  7. COGS 2111. [NOIP2015普及]扫雷游戏

    ★   输入文件:2015mine.in   输出文件:2015mine.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 扫雷游戏是一款十分经典的单机小游戏.在 n 行 ...

  8. (转)SpringMVC学习(十)——SpringMVC与前台的json数据交互

    http://blog.csdn.net/yerenyuan_pku/article/details/72514022 json数据格式在接口调用中.html页面中比较常用,json格式比较简单,解析 ...

  9. Gradle dependencies 依赖方式

    implementation:使用了该命令编译的依赖,仅仅对当前的Moudle提供接口 依赖首先应该设置为implement的,如果没有错,那就用implement,如果有错,那么使用api指令 那为 ...

  10. delphi中使用自定义资源的方法

    如果要在delphi中使用自定义资源文件*.res文件,比如一个光标,此时可以采用下列步骤: 1,创建包含相应的资源文件,这里是创建一个包含自定义光标的res文件. 2,在主窗体的pas文件中加入编译 ...