php 设计模式系列,一看就懂系列之 php设计模式(一)-Go语言中文社区
前言
一提到设计模式,很多人都是敬而远之,一方面由于设计模式有一点忽悠太理论的感觉,另一方面也会觉得设计模式有点难懂不知道该在什么场景下使用。一看就懂系列之php设计模式,主要解决两个问题:
1.用最通俗的话来讲讲设计模式是什么。
2.设计模式到底可以在哪些地方可以用上,顺利装逼成功。
PHP设计模式
单例模式
我的理解
1.一个类一个实例;
2.这个实例必须自行创建;
3.向整个系统提供这个实例
使用姿势
1.数据库应用(缓存):一个系统中会有大量的数据库操作,面对对象开发时候,如果每个地方都去new一个实例,会消耗大量资源并且连接数据库也需要成本的,此时就需要使用单例模式,全局一个实例,减少数据库连接就不容易出现too many connections情况。
2.全局配置信息:每个系统都会有全局的配置信息,会在多处调用,这时候可以定义一个全局配置类,使用单例模式 来实例化一个类进行读取与设置。
伪代码实现
/**
* 设计模式之单例模式
* $_instance必须声明为静态的私有变量
* 构造函数必须声明为私有,防止外部程序new类从而失去单例模式的意义
* getInstance()方法必须设置为公有的,必须调用此方法以返回实例的一个引用
* ::操作符只能访问静态变量和静态函数
* new对象都会消耗内存
* 使用场景:最常用的地方是数据库连接。
* 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。
*/
class man
{
//保存例实例在此属性中
private static $_instance;
//构造函数声明为private,防止直接创建对象
private function __construct()
{
echo '我被实例化了!';
}
//单例方法
public static function get_instance()
{
var_dump(isset(self::$_instance));
if(!isset(self::$_instance))
{
self::$_instance=new self();
}
return self::$_instance;
}
//阻止用户复制对象实例
private function __clone()
{
trigger_error('Clone is not allow' ,E_USER_ERROR);
}
function test()
{
echo("test");
}
}
// 这个写法会出错,因为构造方法被声明为private
//$test = new man;
// 下面将得到Example类的单例对象
$test = man::get_instance();
$test = man::get_instance();
$test->test();
// 复制对象将导致一个E_USER_ERROR.
//$test_clone = clone $test;
工厂模式
我的理解
1.抽象基类,在类中抽象一些方法,在不同的子类中进行实现。
2.继承抽象积累的子类,实现基类中的抽象方法
3.工厂类,实例化所有子类,以供调用。
使用姿势
1.当一个模块有许多相似的功能的时候,可以使用工厂模式,以避免代码耦合。
伪代码实现
/**
*
* 定义个抽象的类,让子类去继承实现它
*
*/
abstract class Operation{
//抽象方法不能包含函数体
abstract public function getValue($num1,$num2);//强烈要求子类必须实现该功能函数
}
/**
* 加法类
*/
class OperationAdd extends Operation {
public function getValue($num1,$num2){
return $num1+$num2;
}
}
/**
* 减法类
*/
class OperationSub extends Operation {
public function getValue($num1,$num2){
return $num1-$num2;
}
}
/**
* 乘法类
*/
class OperationMul extends Operation {
public function getValue($num1,$num2){
return $num1*$num2;
}
}
/**
* 除法类
*/
class OperationDiv extends Operation {
public function getValue($num1,$num2){
try {
if ($num2==0){
throw new Exception("除数不能为0");
}else {
return $num1/$num2;
}
}catch (Exception $e){
echo "错误信息:".$e->getMessage();
}
}
}
定义了一个抽象类,许多子类都实现了抽象的方法,实现了相应各自的功能,极大程度上降低藕合度,十分便于维护和扩展,此时需要再来一个工厂方法 就组成工厂模式 了,工厂方法就是实例化各子类以便调用。
/**
* 工程类,主要用来创建对象
* 功能:根据输入的运算符号,工厂就能实例化出合适的对象
*
*/
class Factory{
public static function createObj($operate){
switch ($operate){
case '+':
return new OperationAdd();
break;
case '-':
return new OperationSub();
break;
case '*':
return new OperationSub();
break;
case '/':
return new OperationDiv();
break;
}
}
}
$test=Factory::createObj('/');
$result=$test->getValue(23,0);
echo $result;
php 设计模式系列,一看就懂系列之 php设计模式(一)-Go语言中文社区相关推荐
- android studio 图表,[期末系列]手把手教你在Android Studio中实现图表-Go语言中文社区...
之所以写这篇博客,不是为了别的,主要是我自己在实现图表过程中,感觉真的挺困难的,虽然网上已经有很多种方法了,我的方法也并非我自己原创的,但是我还是想把我的一些经验分享给大家吧,因为是新手,所以更加懂得 ...
- android面试 源码,Android面试题-onCreate源码都没看过,怎好意思说自己做android-Go语言中文社区...
自定义控件 联网 工具 数据库 源码分析相关面试题 Activity相关面试题 Service相关面试题 与XMPP相关面试题 与性能优化相关面试题 与登录相关面试题 与开发相关面试题 与人事相关面试 ...
- 一看就懂系列之 如何实现与控制php常驻进程
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 前言 关于如何实现与控制php常驻进程,不管是google还是baidu上进行搜索,都没有感觉看起来赏心悦目的解答,于是决定自己 ...
- 如何管理php常驻进程,一看就懂系列之 如何实现与控制php常驻进程-Go语言中文社区...
前言 关于如何实现与控制php常驻进程,不管是google还是baidu上进行搜索,都没有感觉看起来赏心悦目的解答,于是决定自己动手总结下. 有同学会问了,整这个干甚?简单的说就是,可以让一个php脚 ...
- 一看就懂系列之Golang的pprof
前言 这是一篇给网友的文章,正好最近在研究分析golang的性能,我觉得是时候来一个了断了. 正文 1.一句话简介 Golang自带的一款开箱即用的性能监控和分析工具. (全篇看的过程中没必要特意记忆 ...
- 搭建网站, 一看就懂, WordPress建站视频教程, 3套WordPress中文课程
如何自己制作一个专业网站?我们可以用US Domain Center和WordPress来快速建站,只需大概1小时,无需任何代码知识.下面有3套完整的视频教程,你只需跟着其中一套来一步步操作,就可以做 ...
- glide源码中包含了那种设计模式_腾讯阿里华为小米等大厂Android高端面试题145题(含部分详解)-Go语言中文社区...
前言 本篇是结合我之前面试别人的经验,以及跟一些在大厂待过的朋友,讨论总结出的一份很全面的大公司需要用到的一些高端Android技术.这里也专门整理了一个文档,重点和难点都有详细解析. 这些题目有点技 ...
- C++----字符集详解(一看就懂系列)
关注微信公众号"二进制小站"~~获取更多分析~~(文末二维码~~) 写的太好,不敢更改:https://blog.csdn.net/qq_28098067/article/deta ...
- single-shot detection(SSD)目标检测算法详解——(一看就懂系列!!!)
SSD是One-stage系列的优秀算法之一 one-stage的意思是挑选候选框和预测候选框两步是同时完成的,R-CNN家族都是two-stage. SSD有什么创新点? (1)基于Faster-R ...
最新文章
- 用 ffmpeg + m3u8-segment 将h264的ES流转换成m3u8的过程记录
- 还是两个数的交换问题
- QML资源加载和网络透明度
- BLE 蓝牙网关与蓝牙定位
- python定义对象的比较方法
- windows安装MySQL详细步骤
- iOS创建自定义相册
- 人生得意须尽善,人生失意亦无怨;人生一世,草木一秋,乐也,悲也,何乐而不为呢?...
- 漫步在云台山茶园穿越,感受来自李亮先生的美意
- JS之如何判断数据类型
- NDT方法总结与公式推导
- PacBio vs. Oxford Nanopore sequencing
- 电脑连接树莓派3B+
- MapReduce优劣,理解MapReduce与Hadoop
- 微软计算机电源怎么接,这个长得像电源插头的东西,真的是微软最新研发的迷你电脑?!...
- 2:win7 iis7
- matlab python 股票,股票行情数据获取-Python获取股票数据?
- 每日三个笑话-20151002
- [转]一个清华计算机博士生的退学申请
- 音频静默时间截取工具
热门文章
- js html 单引号,JS 和 HTML 中的单引号与双引号
- multiset实现ALV树
- Java第六次作业--异常处理和Java类集
- node.js 学习书籍推荐
- 代码生成器集合(整理)
- 6个最佳的开源Python应用服务器
- magento邮件使用php,用Magento的Email模板机制发邮件
- ubuntu 压缩率最高的软件_[图]Linux六大压缩算法横评:Ubuntu 19.10最终选择LZ4
- 在变量前面加个叹号什么意思_a little表示很少,quite a little什么意思?形容数量多少的用法...
- webrtc之SVC实现(十)