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

本文通过创建游戏单位的例子介绍了工厂模式的基本概念及其优势。通过该模式,可以简化对象创建过程,并易于扩展新的单位类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

问题的提出:
你想使用一个统一的类来创建会员,里面有普通会员,管理员,超级管理员……突然哪天老板说要给他加个上帝,郁闷……重新再修改类吗?哦好吧,…………终于写好了。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('兵种名','前缀或路径'); ?>

这样就能实现对创建对象的任务进行封装。当然,这是最简单的工厂模式。还没考虑到其他因素。请看下面。
我:我狂造小精灵,哈哈,原来有漏洞,无限造精灵。
电脑:你……你……我也无限造苦工……
我:你耍赖……我不玩了……
电脑:是你先耍赖的,怪谁,哈哈……派苦工去灭了你……
我:……怎么办呢?
想知道?下回分解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值