php实现设计模式————单例模式
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实现设计模式————单例模式的更多相关文章
- 设计模式 单例模式(Singleton) [ 转载2 ]
设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...
- 设计模式 单例模式(Singleton) [ 转载 ]
设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创 ...
- c#设计模式-单例模式(面试题)
c#设计模式-单例模式 单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题, public class Singleton { private static Singleto ...
- java设计模式单例模式 ----懒汉式与饿汉式的区别
常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...
- 最简单的设计模式——单例模式的演进和推荐写法(Java 版)
前言 如下是之前总结的 C++ 版的:软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的. 概念不多说,没意思,我自己总结就是: ...
- ES6教程-字符串,函数的参数,了解函数的arguments对象,js面向对象,设计模式-单例模式,解构赋值
前言 主要讲解了ES6对字符串的拓展,包括includes,startsWith和endsWith,另外增加了字符串模板. Start includes()是否包含 startsWith()以什么开头 ...
- Java设计模式の单例模式
-------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱 ...
- java设计模式——单例模式(一)
一. 定义与类型 定义:保证一个类仅有一个实例,并提供一个全局访问点 类型:创建型 二. 适用场景 想确保任何情况下都绝对只用一个实例 三. 优缺点 优点: 在内存里只有一个实例,减少了内存开销 可以 ...
- JAVA设计模式-单例模式(Singleton)线程安全与效率
一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...
随机推荐
- DNS练习之反向解析
环境同正向解析一样. 切换到/var/named/chroot/etc目录下: 编辑named.rfc1912.zones文件,在末尾添加如下内容: [root@sishen63 etc]# vim ...
- Pycharm中pygame报错
什么鬼???我记得刚安装过啊-.. 并且本机只有一个python3.5,环境变量之前都是正常,我去折腾了大半天,原来在pycharm中安装模块是在如下所示图中 以后如果没有安装模块,都可以在这里进行安 ...
- Unity项目学习笔记
1.TCP和IP IP:主要作用是在复杂的网络环境中将数据包发送给的最终的目标地址. 端口号:系统会分给系统端口号 一般知名的端口号在0-1023之间,而我们经常使用的自定义/动态分配的端口号则一般 ...
- Ionic之增加样式会自动换行解决方案
设置样式的时候,引用自身的样式,能正常显示,但是引用自定义样式显示的时候,竟然或自动换行,好尴尬. 原本代码: $('.codeSuccess').css({'display':'block'}); ...
- gulp插件之gulp-mock-server
本文讲gulp-mock-server的应用,用于虚拟一个服务器,模拟后台返回json数据给前端,这样可以一定程度上实现前后端分离,约定好接口之后,前后端即可同时开发,从而提高效率. 在gulpfil ...
- AJPFX关于多线程概述及应用
一.认识多任务.多进程.单线程.多线程要认识多线程就要从操作系统的原理说起. 以前古老的DOS操作系统(V 6.22)是单任务的,还没有线程的概念,系统在每次只能做一件事情.比如你在copy东西的时候 ...
- SpringBoot 2.x (6):使用Filter、Servlet、Listener
Filter的使用: 1.常见的默认Filter有: characterEncodingFilter hiddenHttpMethodFilter httpPutFormContentFilter r ...
- CF779B(round 402 div.2 B) Weird Rounding
题意: Polycarp is crazy about round numbers. He especially likes the numbers divisible by 10k. In the ...
- 关于<meta NAME="keywords" CONTENT="">
昨天终于以实习身份入职一家小创业公司,今天让我多看看别人的网页怎么写的,发现了一个以前都没关注过的东西. <meta name="keywords" content=&quo ...
- git项目常用命令
git rm --cached 文件名 //移除不上传 git add . //添加所有文件 .gitignore //git忽略不想上传或者不需要上传的文件 REAMDE.md 文 ...