PHP程序员站--PHP编程开发平台
 当前位置:主页 >> PHP高级编程 >> 高级应用 >> 

PHP设计模式介绍 第三章 工厂模式

PHP设计模式介绍 第三章 工厂模式

来源:互联网  作者:  发布时间:2010-05-20
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实

例子:增加一些颜色

让我们更深入工厂模式吧。继续如前,先建立一个能为本章节的其它部分持续举例说明的简单类。 这是一个输出十六进制的HTML RGB Color类,包括了R, G, 和 B三个属性(在构造对象的时候引入)和 getRgb()方法,getRgb()的作用是返回一个十六进制颜色的字符串。

和以前一样,我们按照测试驱动开发(TDD)的方法:写一个测试,再写一段代码满足该测试,如果需要,反复下去。

下面是一个非常简单的起始测试:

function TestInstantiate() {
$this->assertIsA($color = new Color, ‘Color’);
$this->assertTrue(method_exists($color, ‘getRgb’));
}

为了满足这个测试,你可以设计这样一个类。测试看起来有点像伪代码:

class Color {
function getRgb() {}
}

( 这个Color类也许看起来像处于娃娃阶段, 但是 TDD是一个反复的过程。 代码非常少,当需要的时候:你开始有了新的想法或者想精确的执行代码时,可以增加的。)

接下来, 当颜色对象被建立时,getRgb() 方法应该返回以红色,绿色,和蓝色的十六进制字符串。 用一个测试说明一下:

function TestGetRgbWhite() {
$white =& new Color(255,255,255);
$this->assertEqual(‘#FFFFFF’, $white->getRgb());
}

每个 TDD, 你写最简单的可行的代码来满足测试, 并不需要满足人的审美观或者代码的正确执行。

下面是最简单的,能够通过测试的代码:

class Color {
function getRgb() { return ‘#FFFFFF’; }
}

这个Color类不是令人十分满意, 但是它确实表现了逐渐增加的过程。

下一步,让我们增加一个额外的测试使这个Color类的的确确地执行并返回正确的信息:

 

 

这个Color类必须改变什么呢? 首先必须把红色,绿色,和蓝色的值储存在三个变量里,然后在调用一个方法把十进制数转化为十六进制数。按照这个要求执行的代码可以写作:

class Color {
var $r=0;
var $g=0;
var $b=0;
function Color($red=0, $green=0, $blue=0)
{
$this->r =$red;
$this->g = $green;
$this->b = $blue;
}
function getRgb() {
return sprintf(‘#%02X%02X%02X’, $this->r, $this->g, $this->b);
}
}

这个构造非常简单: 先收集红色,绿色,和蓝色的数值,然后储存在变量中, getRgb() 方法使用 sprintf() 函数将十进制数转换成十六进制数。

为了对代码充满更多的信心, 你可以用较多的数值来测试它。 这一个测试可以用以下代码实现:

function TestGetRgbRandom() {
$color =& new Color(rand(0,255), rand(0,255), rand(0,255));
$this->assertWantedPattern(
‘/^#[0-9A-F]{6}$/’,
$color->getRgb());
$color2 =& new Color($t = rand(0,255), $t, $t);
$this->assertWantedPattern(
‘/^#([0-9A-F]{2})\1\1$/’,
$color2->getRgb());
}

注:assertWantedPattern
assertWantedPattern() 作用是:使它的第二个叁数匹配第一个参数,第一个参数是正则表达式。如果匹配,这个测试就通过; 否则不通过。
由于assertWantedPattern()具有进行正确的正则表达式匹配的功能,所以常被用作测试。


延伸阅读:
《PHP设计模式介绍》导言
PHP设计模式介绍 第一章 编程惯用法
PHP设计模式介绍 第二章 值对象模式

Tags: php   设计模式   工厂模式   设计   模式  
最新文章
推荐阅读
月点击排行榜
PHP程序员站 Copyright © 2007-2010,PHPERZ.COM All Rights Reserved 粤ICP备07503606号