前言

一提到设计模式,很多人都是敬而远之,一方面由于设计模式有一点忽悠太理论的感觉,另一方面也会觉得设计模式有点难懂不知道该在什么场景下使用。一看就懂系列之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语言中文社区相关推荐

  1. android studio 图表,[期末系列]手把手教你在Android Studio中实现图表-Go语言中文社区...

    之所以写这篇博客,不是为了别的,主要是我自己在实现图表过程中,感觉真的挺困难的,虽然网上已经有很多种方法了,我的方法也并非我自己原创的,但是我还是想把我的一些经验分享给大家吧,因为是新手,所以更加懂得 ...

  2. android面试 源码,Android面试题-onCreate源码都没看过,怎好意思说自己做android-Go语言中文社区...

    自定义控件 联网 工具 数据库 源码分析相关面试题 Activity相关面试题 Service相关面试题 与XMPP相关面试题 与性能优化相关面试题 与登录相关面试题 与开发相关面试题 与人事相关面试 ...

  3. 一看就懂系列之 如何实现与控制php常驻进程

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 前言 关于如何实现与控制php常驻进程,不管是google还是baidu上进行搜索,都没有感觉看起来赏心悦目的解答,于是决定自己 ...

  4. 如何管理php常驻进程,一看就懂系列之 如何实现与控制php常驻进程-Go语言中文社区...

    前言 关于如何实现与控制php常驻进程,不管是google还是baidu上进行搜索,都没有感觉看起来赏心悦目的解答,于是决定自己动手总结下. 有同学会问了,整这个干甚?简单的说就是,可以让一个php脚 ...

  5. 一看就懂系列之Golang的pprof

    前言 这是一篇给网友的文章,正好最近在研究分析golang的性能,我觉得是时候来一个了断了. 正文 1.一句话简介 Golang自带的一款开箱即用的性能监控和分析工具. (全篇看的过程中没必要特意记忆 ...

  6. 搭建网站, 一看就懂, WordPress建站视频教程, 3套WordPress中文课程

    如何自己制作一个专业网站?我们可以用US Domain Center和WordPress来快速建站,只需大概1小时,无需任何代码知识.下面有3套完整的视频教程,你只需跟着其中一套来一步步操作,就可以做 ...

  7. glide源码中包含了那种设计模式_腾讯阿里华为小米等大厂Android高端面试题145题(含部分详解)-Go语言中文社区...

    前言 本篇是结合我之前面试别人的经验,以及跟一些在大厂待过的朋友,讨论总结出的一份很全面的大公司需要用到的一些高端Android技术.这里也专门整理了一个文档,重点和难点都有详细解析. 这些题目有点技 ...

  8. C++----字符集详解(一看就懂系列)

    关注微信公众号"二进制小站"~~获取更多分析~~(文末二维码~~) 写的太好,不敢更改:https://blog.csdn.net/qq_28098067/article/deta ...

  9. single-shot detection(SSD)目标检测算法详解——(一看就懂系列!!!)

    SSD是One-stage系列的优秀算法之一 one-stage的意思是挑选候选框和预测候选框两步是同时完成的,R-CNN家族都是two-stage. SSD有什么创新点? (1)基于Faster-R ...

最新文章

  1. 用 ffmpeg + m3u8-segment 将h264的ES流转换成m3u8的过程记录
  2. 还是两个数的交换问题
  3. QML资源加载和网络透明度
  4. BLE 蓝牙网关与蓝牙定位
  5. python定义对象的比较方法
  6. windows安装MySQL详细步骤
  7. iOS创建自定义相册
  8. 人生得意须尽善,人生失意亦无怨;人生一世,草木一秋,乐也,悲也,何乐而不为呢?...
  9. 漫步在云台山茶园穿越,感受来自李亮先生的美意
  10. JS之如何判断数据类型
  11. NDT方法总结与公式推导
  12. PacBio vs. Oxford Nanopore sequencing
  13. 电脑连接树莓派3B+
  14. MapReduce优劣,理解MapReduce与Hadoop
  15. 微软计算机电源怎么接,这个长得像电源插头的东西,真的是微软最新研发的迷你电脑?!...
  16. 2:win7 iis7
  17. matlab python 股票,股票行情数据获取-Python获取股票数据?
  18. 每日三个笑话-20151002
  19. [转]一个清华计算机博士生的退学申请
  20. 音频静默时间截取工具

热门文章

  1. js html 单引号,JS 和 HTML 中的单引号与双引号
  2. multiset实现ALV树
  3. Java第六次作业--异常处理和Java类集
  4. node.js 学习书籍推荐
  5. 代码生成器集合(整理)
  6. 6个最佳的开源Python应用服务器
  7. magento邮件使用php,用Magento的Email模板机制发邮件
  8. ubuntu 压缩率最高的软件_[图]Linux六大压缩算法横评:Ubuntu 19.10最终选择LZ4
  9. 在变量前面加个叹号什么意思_a little表示很少,quite a little什么意思?形容数量多少的用法...
  10. webrtc之SVC实现(十)