您的位置:首页 > 编程语言 > PHP开发

魔兽争霸之PHP设计模式-工厂模式[Factory]

2009-11-13 21:36 411 查看
前言:相信有的人接触过会员系统,有的甚至写过。本文章不是为了说明怎么建设一个会员系统。而是提出一种思路。想学怎么建会员系统的可以不看本文,而想知道怎么建得更专业点的没事可以看看。哈哈。

问题的提出:
你想使用一个统一的类来创建会员,里面有普通会员,管理员,超级管理员……突然哪天老板说要给他加个上帝,郁闷……重新再修改类吗?哦好吧,…………终于写好了。555,使用前还要考虑是不是老板,还要判断,烦……如果你一开始就按工厂模式写的话或许就好多了。
工厂模式的作用:
可能你看到这里还有点郁闷,不知道工厂模式有什么用。来吧。那我们先玩下游戏先。可能放松一下你突然就领悟到了。
开个魔兽先,哇好多种族啊,有人族(Human),兽族(ORC),暗夜精灵族(Nighy Elf),不死族(Undead)。选了个暗夜精灵族(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()
       {
              //这里是减少已有人口的代码
       }
}
//哈哈,先造个精灵啦
$w1 = new Wisp();
$w1->Build();//我建造建筑
$w1->Build();//我再建造建筑
?>




电脑:555……你不给我苦工(Peon),我怎么建东西啊……这摆明欺负人……不……欺负电脑
我:呃……这个……对了,高兴过头了,忘记了,我帮你建一个……,这不是复制代码然后修改一下就行了吗,多简单~~



<?php
/*
*一个苦工的类
*/
class Peon
{
       private $mHealthPoint = 250;//这是苦工的血量
       private $mArmor = 0;//这是苦工的护甲

       //苦工能建造建筑
       public function Build()
       {
         echo '苦工建造建筑咯。<br/>';
       }

       //每个苦工被造出来时还会占用一个人口
       public function __construct()
       {
         echo '你已经建造了一个苦工。<br/>';
         //这里是增加已有人口的代码
       }

       //每个苦工死亡会减少你占用的人口
       public function __destruct()
       {
              //这里是减少已有人口的代码
       }
//哈哈,可以造苦工啦
$p1 = new Peon();
$p1->Build();//我建造建筑
}
?>




不死族:我也要僧侣
人族:我要农民
不死族,人族:你太不公平了!
我:(怎么办,难道又要再复制一个类……算了想想看有没有什么好办法),如果弄得多了,那每次要建造我都要记住不同的名字,多复杂啊。建造精灵是 new Wisp(),建造苦工是new Peon(),建造农民是new Peasant,建造侍僧又是new Acolyte,那不是很麻烦。怎么办呢?而且为了便于管理。我想把每个兵种的类分成一个独立文件,方便以后修改。那每次还要载入不同兵种的文件。实在太麻烦了。
电脑:你不会工厂模式吗?郁闷……
我:哦!对哦。嘻嘻(*^_^*)
观众:=_=///这么一大堆才进入主题啊
我:我这不是为了大家了解一下区别嘛……大家少安毋躁。
把刚才那段小精灵的类放在class_Wisp.php里面

<?php
/*
*一个小精灵的类
*/
class Wisp
{
       private $mHealthPoint = 120;//这是小精灵的血量
       private $mArmor = 0;//这是小精灵的护甲

       //小精灵能建造建筑
       public function Build()
       {
         echo '精灵建造建筑咯。<br/>';
       }

       //每个小精灵被造出来时还会占用一个人口
       public function __construct()
       {
         echo '你已经建造了一个小精灵。<br/>';
         //这里是增加已有人口的代码
       }

       //每个小精灵死亡会减少你占用的人口
       public function __destruct()
       {
              //这里是减少已有人口的代码
       }
}
?>




把刚才那段苦工的类放在class_Peon.php里面

<?php
/*
*一个苦工的类
*/
class Peon
{
       private $mHealthPoint = 250;//这是苦工的血量
       private $mArmor = 0;//这是苦工的护甲

       //苦工能建造建筑
       public function Build()
       {
         echo '苦工建造建筑咯。<br/>';
       }

       //每个苦工被造出来时还会占用一个人口
       public function __construct()
       {
         echo '你已经建造了一个苦工。<br/>';
         //这里是增加已有人口的代码
       }

       //每个苦工死亡会减少你占用的人口
       public function __destruct()
       {
              //这里是减少已有人口的代码
       }
//哈哈,可以造苦工啦
$p1 = new Peon();
$p1->Build();//我建造建筑
}
?>




那么工厂呢。别急,建个class_Factory.php的文件。



<?php
/*
*工厂模式开始咯
*我是用来创建各种不同单位(兵种)的哦
*/
class CreatArms
{
  public function __construct(){}
  public function Creat($arms,$path = '')
  {
      include $path.$arms.'.php'; //包含要这个类的文件
      return new $arms; //返回你创建的兵种对象的句柄
  }
}
$creator = new CreatArms();//不管创建啥,我都只要使用这个类
$w1 = $creator->Creat('Wisp','class_');//创建一个小精灵
$w1->Build();//让小精灵造建筑
?>




至此,只要你想添加兵种,直接以class_兵种名.php做为文件名。(虽然你也可以使用__autoload自动载入类文件,但是以后会讲工厂模式更深层的应用,这可不只是为了解决__autoload也能解决的问题)然后用兵种名做为类名。然后实例化的时候只要如下:



<?php
include 'class_Factory.php';
$creator = new CreatArms();
$w1 = $creator->Creat('兵种名','前缀或路径'); 
?>




这样就能实现对创建对象的任务进行封装。当然,这是最简单的工厂模式。还没考虑到其他因素。请看下面。
我:我狂造小精灵,哈哈,原来有漏洞,无限造精灵。
电脑:你……你……我也无限造苦工……
我:你耍赖……我不玩了……
电脑:是你先耍赖的,怪谁,哈哈……派苦工去灭了你……
我:……怎么办呢?
想知道?下回分解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: