文档章节

螃蟹学PHP设计模式之工厂模式

行走的螃蟹
 行走的螃蟹
发布于 2014/08/06 11:47
字数 784
阅读 78
收藏 1

7.工厂模式

昨天晚上公司开会,回去都十一点了,原本打算昨天解决的工厂模式留到今天了,下午还得去跑工商局,希望创业之路顺利吧。螃蟹觉得工厂模式应该是使用比较多的,但是要和建造者模式区分开,建造者是原对象不确定,而工厂模式是同一类的对象有多个。螃蟹还是用比喻来说明,你要生产手机,要做手机肯定要先做一个模型,然后根据模型来生产各种贴牌手机,然后山寨大王由此诞生。其实之前学的委托模式和这个比较像,不过委托模式对对象的控制更多一些,工厂模式只是用于生产对象,不做其他的控制,而且对象的类别是一样的。

参考项目模块:道具系统

虽然螃蟹没开发游戏,但是一般网络游戏都有道具商店,而道具一般都会增加,这个螃蟹觉得是利用工厂模式极好的例子。下面螃蟹就来实现一个简单的道具系统,

首先创建道具基类:BaseProp.php

<?php
class BaseProp{
	protected $_name = null;
	protected $_description = null;
	protected $_price = 0; //售价
	protected $_physical = 0; //体力变化
	protected $_damage = 0; //攻击变化

	/**
	 * @return the $_name
	 */
	public function getName() {
		return $this->_name;
	}

	/**
	 * @return the $_description
	 */
	public function getDescription() {
		return $this->_description;
	}

	/**
	 * @return the $_price
	 */
	public function getPrice() {
		return $this->_price;
	}

	/**
	 * @return the $_physical
	 */
	public function getPhysical() {
		return $this->_physical;
	}

	/**
	 * @return the $_damage
	 */
	public function getDamage() {
		return $this->_damage;
	}
	
	public function getProp(){
		$prop = array();
		$prop['name'] = $this->_name;
		$prop['description'] = $this->_description;
		$prop['price'] = $this->_price;
		$prop['physical'] = $this->_physical;
		$prop['damage'] = $this->_damage;
		return $prop;
	}
}

基类包含了道具的各个基本属性和方法,然后创建道具对象:

铜道具对象:Copper.Prop.php

<?php
require_once('BaseProp.php');

class CopperProp extends BaseProp{
	function __construct(){
		$this->_name = '铜';
		$this->_description = '使用本催化剂,能提高攻击力';
		$this->_price = 50; //售价
		$this->_physical = 50; //生命力变化
		$this->_damage = 200; //攻击力变化
	}
}

金道具对象:Gold.Prop.php

<?php
require_once('BaseProp.php');

class GoldProp extends BaseProp{
	function __construct(){
		$this->_name = '金';
		$this->_description = '使用本催化剂,能提高生命力';
		$this->_price = 150; //售价
		$this->_physical = 300; //生命力变化
		$this->_damage = 90; //攻击力变化
	}
}

再定义一个道具工厂类,用来生产道具对象:FactoryProp.php

<?php 
class FactoryProp{
	public static function create($prop_type){
		$class_file = $prop_type.'.Prop.php';
		require_once($class_file);
		$class_obj = $prop_type.'Prop';
		return new $class_obj;
	}
}
?>

好,最后仍是不厌其烦的测试类:TestFacory.php

<?php 
require('FactoryProp.php');
//模拟道具数组
$prop_type = array('Copper','Gold');
//循环输出
foreach($prop_type as $k => $v){
	$prop = FactoryProp::create($v);
	print_r($prop->getProp());
	echo '<br>';
}
?>

输出结果:

Array ( [name] => 铜 [description] => 使用本催化剂,能提高攻击力 [price] => 50 [physical] => 50 [damage] => 200 ) 
Array ( [name] => 金 [description] => 使用本催化剂,能提高生命力 [price] => 150 [physical] => 300 [damage] => 90 )

使用工厂模式对于大规模对象的处理是很好的和必要的,感觉软件设计的逻辑思维真的很了不起,螃蟹不太喜欢称程序员为码农,作为开发工程师,应该是多think&created,而不是用固化的思维去流水线生产代码和产品。再等一会就可以吃饭了......

© 著作权归作者所有

行走的螃蟹

行走的螃蟹

粉丝 33
博文 48
码字总数 23634
作品 0
杭州
程序员
私信 提问
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
0
0
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
228
2
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69
学了那么多年设计模式依然不会用!那可真蠢!

什么是设计模式? 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决...

GitChat技术杂谈
2018/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux高级文件数据操作

cat :显示切割数据 -f:选择显示切割列; -s:比现实没有分割的行 -d:自定义分隔符 cut -d ‘ ’-f 1,3 a.txt : 以空格为分隔符显示第一列和第三列;这种情况不能分隔的行也会显示出来,如...

为何不可1995
24分钟前
0
0
在Javascript中Eval函数的使用

【eval()函数】 JavaScript有许多小窍门来使编程更加容易。 其中之一就是eval()函数,这个函数可以把一个字符串当作一个JavaScript表达式一样去执行它。 举个小例子: var the_unevaled_ans...

花漾年华
35分钟前
3
0
[日更-2019.5.22、23] Android 系统的分区和文件系统(二)--Android 文件系统中的文件

声明 Android系统中有很多分区,每个分区内的文件系统一般都不同的,使用ADB进入系统/目录下可发现挂载这很多的目录,不同的目录中可来自不同的分区及文件系统; 那么,就来分下这些目录里面...

小馬佩德罗
40分钟前
2
0
数组操作相关算法

/*数组的相关的算法操作:1、在数组中找最大值/最小值*/class Test11_FindMax{public static void main(String[] args){int[] array = {4,2,6,8,1};//在数组中找最大...

architect刘源源
今天
4
0
okhttp3 以上版本在安卓9.0无法请求数据的解决方案

应用官方的说明:在 Android 6.0 中,我们取消了对 Apache HTTP 客户端的支持。 从 Android 9 开始,默认情况下该内容库已从 bootclasspath 中移除且不可用于应用。且Android P 限制了明文流量...

chenhongjiang
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部