- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章php设计模式小结由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、单例模式 。
所谓单例模式,也就是在任何时候,应用程序中只会有这个类的一个实例存在。常见的,我们用到单例模式只让一个对象去访问数据库,从而防止打开多个数据库连接。要实现一个单例类应包括以下几点:
和普通类不同,单例类不能被直接实例化,只能是由自身实例化。因此,要获得这样的限制效果,构造函数必须标记为private。 要让单例类不被直接实例化而能起到作用,就必须为其提供这样的一个实例。因此,就必须要让单例类拥有一个能保存类的实例的私有静态成员变量和对应的一个能访问到实例的公共静态方法。 在PHP中,为防止对单例类对象的克隆来打破单例类的上述实现形式,通常还为基提供一个空的私有__clone()方法。 下面是一个基本的单例模式:
class SingetonBasic { private static $instance,
。
// other vars.. 。
private function __construct() { // do construct.. } 。
private function __clone() {} 。
public static function getInstance() { if (!(self::$instance instanceof self)) { self::$instance = new self(); } return self::$instance; } 。
// other functions.. } 。
$a = SingetonBasic::getInstance(); $b = SingetonBasic::getInstance(); var_dump($a === $b),
。
2、工厂模式 工厂模式在于可以根据输入参数或者应用程序配置的不同来创建一种专门用来实现化并返回其它类的实例的类。下面是一个最基本的工厂模式:
。
class FactoryBasic { public static function create($config) { 。
。
} } 。
。
比如这里是一个描述形状对象的工厂,它希望根据传入的参数个数不同来创建不同的形状.
。
// 定义形状的公共功能:获取周长和面积。 interface IShape { function getCircum(); function getArea(); } 。
。
// 定义矩形类 class Rectangle implements IShape { private $width, $height,
public function __construct($width, $height) { $this->width = $width; $this->height = $height; } 。
public function getCircum() { return 2 * ($this->width + $this->height); } 。
public function getArea() { return $this->width * $this->height; } } 。
// 定义圆类 class Circle implements IShape { private $radii,
public function __construct($radii) { $this->radii = $radii; } 。
public function getCircum() { return 2 * M_PI * $this->radii; } 。
public function getArea() { return M_PI * pow($this->radii, 2); } } 。
// 根据传入的参数个数不同来创建不同的形状。 class FactoryShape { public static function create() { switch (func_num_args()) { case 1: return new Circle(func_get_arg(0)); break; case 2: return new Rectangle(func_get_arg(0), func_get_arg(1)); break; } } } 。
// 矩形对象 $c = FactoryShape::create(4, 2); var_dump($c->getArea()); // 圆对象 $o = FactoryShape::create(2); var_dump($o->getArea()),
使用工厂模式使得在调用方法时变得更容易,因为它只有一个类和一个方法,若没有使用工厂模式,则要在调用时决定应该调用哪个类和哪个方法;使用工厂模式还使得未来对应用程序做改变时更加容易,比如要增加一种形状的支持,只需要修改工厂类中的create()一个方法,而没有使用工厂模式,则要修改调用形状的代码块.
。
3、观察者模式 观察者模式为您提供了避免组件之间紧密耦合的另一种方法。该模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因.
一个简单的示例:当听众在收听电台时(即电台加入一个新听众),它将发送出一条提示消息,通过发送消息的日志观察者可以观察这些消息.
// 观察者接口 interface IObserver { function onListen($sender, $args); function getName(); } 。
。
// 可被观察接口 interface IObservable { function addObserver($observer); function removeObserver($observer_name); } 。
// 观察者类 abstract class Observer implements IObserver { protected $name,
public function getName() { return $this->name; } } 。
// 可被观察类 class Observable implements IObservable { protected $observers = array(),
public function addObserver($observer) { if (!($observer instanceof IObserver)) { return; } $this->observers[] = $observer; } 。
public function removeObserver($observer_name) { foreach ($this->observers as $index => $observer) { if ($observer->getName() === $observer_name) { array_splice($this->observers, $index, 1); return; } } } } 。
// 模拟一个可以被观察的类:RadioStation class RadioStation extends Observable { 。
public function addListener($listener) { foreach ($this->observers as $observer) { $observer->onListen($this, $listener); } } } 。
// 模拟一个观察者类 class RadioStationLogger extends Observer { protected $name = 'logger',
public function onListen($sender, $args) { echo $args, ' join the radiostation.<br/>'; } } 。
// 模拟另外一个观察者类 class OtherObserver extends Observer { protected $name = 'other'; public function onListen($sender, $args) { echo 'other observer..<br/>'; } } 。
$rs = new RadioStation(),
// 注入观察者 $rs->addObserver(new RadioStationLogger()); $rs->addObserver(new OtherObserver()),
// 移除观察者 $rs->removeObserver('other'),
// 可以看到观察到的信息 $rs->addListener('cctv'),
。
最后此篇关于php设计模式小结的文章就讲到这里了,如果你想了解更多关于php设计模式小结的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
目录 前言 style-loader css-loader sass-loader postcss-loader babel-l
目录 1、简单动态字符串(SDS) 2、链表 3、字典 哈希表 哈希表节点 字典 4、跳跃表
JS运行三部曲 js运行代码共分三步 语法分析 预编译 解释执行 JavaScript代码在运行时,首先会进行语法分析,通篇检查代码是否存在低级错误,然后进行预编译,整理内
目录 +拼接方式 sprintf函数 Join函数 buffer.Builderbuffer.WriteString函数 buffer.B
下面整理下python有哪些方式可以读取数据文件。 1. python内置方法(read、readline、readlines) read() : 一次性读取整个文件内容。推荐使用re
背景 项目中的流程监控,有几种节点,需要监控每一个节点是否超时。按传统的做法,肯定是通过定时任务,去扫描然后判断,但是定时任务有缺点:1,数据量大会慢;2,时间不好控制,太短,怕一
目录 1. 提炼函数 2. 合并重复的条件片段 3. 把条件分支语句提炼成函数 4. 合理使用循环 5. 提前让函数退出代替嵌套条件分支
开始之前,pandas中dataframe删除对象可能存在几种情况 1、删除具体列 2、删除具体行 3、删除包含某些数值的行或者列 4、删除包含某些字符、文字的行或者列 本文就针对这四种情况探讨
setData setData 是小程序开发中使用最频繁的接口,也是最容易引发性能问题的接口。在介绍常见的错误用法前,先简单介绍一下 setData 背后的工作原理。 工作原理 小程序的视图层
下面是五种实现斐波那契数列的方法 循环 ? 1
一,分析代码运行时间 第1式,测算代码运行时间 平凡方法 快捷方法(jupyter环境) 第2式,测算代码多次运行平均时间 平凡方法 快捷方法(jupyter环境) 第
python之成为图像处理任务的最佳选择,是因为这一科学编程语言日益普及,并且其自身免费提供许多最先进的图像处理工具。本文主要介绍了一些简单易懂最常用的python图像处理库。 当今世界充满了各种
流式布局 采用流式布局会将元素按从左到右的顺序排列,如果一个元素在一行中放不下,那这个元素会另起一行依然按照从左到右的顺序排列 示例: 代码 public class Tes
@PropertySource 作用是:对自定义的properties文件加载 使用:@PropertySource(value={"classpath:people.properti
实现消息队列的两种方式 apache activemq官方实例发送消息 直接在apache官网http://activemq.apache.org/download-archives.html下
常用配置 以下配置能使用File -> New Projects Settings -> Settings for New Projects进行配置的尽量用这个配置,因为这个配置是作用
摘要: 开发者开发部署web应用时通常使用tomcat服务器,很多初学者只懂得在开发工具上配置,但离开了开发工具,自己手动配置部署,并让一个项目跑起来,你会了吗。小编也遇到过这样的困扰。网上查找的
1. 字符串的翻转 利用切片 ? 1
cookie和session在java web开发中扮演了十分重要的作用,本篇文章对其中的重要知识点做一些探究和总结。 1.cookie存在于浏览器 随意打开一个网址,用火狐的调试工具,随意选取
1、使用内置的tomcat,通过java -jar的方式启动 比如:java -jar bms.jar 但是这种启动方式 一旦关闭控制台 或者crtl+c 退出 此时应用就关闭了
我是一名优秀的程序员,十分优秀!