三、工厂模式:
问题的提出:
最初在设计模式一书中,许多设计模式都鼓励使用松散耦合。要理解这个概念,让我们最好谈一下许多开发人员从事大型系统的艰苦历程。在更改一个代码片段时,就会发生问题,系统其他部分 —— 您曾认为完全不相关的部分中也有可能出现级联破坏。
该问题在于紧密耦合。系统某个部分中的函数和类严重依赖于系统的其他部分中函数和类的行为和结构。您需要一组模式,使这些类能够相互通信,但不希望将它们紧密绑定在一起,以避免出现联锁。
在大型系统中,许多代码依赖于少数几个关键类。需要更改这些类时,可能会出现困难。例如,假设您有一个从文件读取的 User 类。您希望将其更改为从数据库读取的其他类,但是,所有的代码都引用从文件读取的原始类。这时候,使用工厂模式会很方便。
工厂模式是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。
问题的解决:
呵呵,估计有些phper没看懂吧,没关系,那是我从其他地方抄的,我们下面还是通过魔兽来进行吧。这一部分,我看都已经有前人写好了,我就基本上照抄了,请前人不要见怪啊。呵呵。
前面选了暗夜精灵族(Nighy Elf),和兽族(ORC),因为小精灵(Wisp)能建造建筑,还能自爆。所以根据这个我们下面先写个小精灵(Wisp)的类。
<?php
class Wisp
{
private $mHealthPoint = 120;//这是小精灵的血量
private $mArmor = 0;//这是小精灵的护甲
//小精灵能建造建筑
public function Build()
{
echo '精灵建造建筑咯。<br/>';
}
//每个小精灵被造出来时还会占用一个人口
public function __construct()
{
echo '你已经建造了一个小精灵。<br/>';
//这里是增加已有人口的代码
}
//每个小精灵死亡会减少你占用的人口
public function __destruct()
{
//这里是减少已有人口的代码
}
}
把这些代码放在Arms/ Wisp.php中。
啊,还有还有,还有苦工(Peon)的类
<?php
class Peon
{
private $mHealthPoint = 250;//这是苦工的血量
private $mArmor = 0;//这是苦工的护甲
//苦工能建造建筑
public function Build()
{
echo '苦工建造建筑咯。<br/>';
}
//每个苦工被造出来时还会占用一个人口
public function __construct()
{
echo '你已经建造了一个苦工。<br/>';
//这里是增加已有人口的代码
}
//每个苦工死亡会减少你占用的人口
public function __destruct()
{
//这里是减少已有人口的代码
}
}
把这些代码放在Arms/ Peon.php中。
等等,这样岂不是很复杂,魔兽里面还有那么多的兵种,另外都还有两个种族,每次创建一个兵就要new一个,要是记不住这个兵的类名,岂不是new不了?而且如果一个兵是一个类,放在一个文件里,那是不是一开始就要把所有的几十上百个文件都include一次啊,那效率可想而知啊。
嘿嘿,当然是有解决办法的啊,我们再写一个类把这些类都封装起来,这个把兵种都封装起来的类我们称之为工厂类,他可以像生产产品一样,来创建兵,帮我们对其实例化。下面我们就来看这个类怎么实现吧。
<?php
class CreatArms
{
public function __construct(){}
public function Creat($arms,$path = '')
{
include $path.$arms.'.php'; //包含要这个类的文件
return new $arms; //返回你创建的兵种对象的句柄
}
}
这样,即使在兵种多样的情况下,我们仍然可以很方便地实例化:
$creator = new CreatArms();
$w1 = $creator->Creat('兵种名','前缀或路径');
例如创建小精灵:
$creator = new CreatArms();//不管创建啥,我都只要使用这个类
$w1 = $creator->Creat(‘Wisp’,’./Arms/’);//创建一个小精灵
$w1->Build();//让小精灵造建筑
这就是传说中的工厂模式,通过工厂模式,对于如论坛那种有很多种用户的,特别是为了以后扩展比较方便的,采用工厂模式,是个很好的解决方法。在zend framework中的Zend_Form、Zend_Filter、Zend_Validate就是用工厂模式来构架的。
延伸阅读:
php中的安全模式是指的什么?
阻碍职业生涯的12种行为模式(ZT)
数据库设计方法、规范与技巧
数据库正规化和设计技巧
设计网站时的十大严重错误
MVC模式的PHP实现
数据库设计的定义
网页表单(input)设计实例技巧五则
PHP程序61条面向对象分析设计的经验原则