微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

解析PHP工厂模式的好处

顾名思义,工厂是可以加工零件的,PHP程序中的工厂模式也有相同的功能,可以方便的使用一个静态的工厂方法来实例化某一个类,那么这样做的好处是什么呢?初学PHP的设计模式,以下是我个人的理解
一般我们实例化一个类会给它一些参数以便在其构析的时候可以根据不同的参数反馈出我们需要的结果。

<FONT style="COLOR: #ff0000">举例说明,以下是一个User类,非常简单:

<div class="codetitle"><a style="CURSOR: pointer" data="44169" class="copybut" id="copybut44169" onclick="doCopy('code44169')"> 代码如下:
<div class="codebody" id="code44169">
<?PHP
interface IUser{
function getName();
function getAge();
}
class User implements IUser{
protected $_name;
protected $_age;
function construct($name,$age){
$this->_name = $name;
$this->_age = (int)$age;
}
function getName(){
return $this->_name;
}
function getAge(){
return $this->_age;
}
}
?>

我们如果要实例化这个类就要这样:

<FONT style="COLOR: #ff0000">$u = new User(‘小明‘,19);

一般如果这个类很少使用,那么这样做没什么太大影响,也非常好。
突然我想给这个类增加一个归类,把小明放入学生组,修改下类代码实现非常容易,但如果这个类在我们想修改之前在很多文件地方多次的实例化了,那么想为其增加一个参数就会变的非常烦琐,因为需要替换成:

<FONT style="COLOR: #ff0000">$u = new User(‘小明‘,19,‘学生‘);

当然我们也可以通过在
construct函数中进行认值设置来避免这种重复劳动,但事实上从代码优雅角度来说这样很不好,设想我们有一个工厂方法可以通过一个标识来对应一组参数,并把这个参数存放在某个文本文档或是直接以数组的形式存放在工厂类中,我们在调用User类的时候就会变的轻松许多,即便是需要增减参数属性也不需要到处进行代码的替换,下面就是一个工厂类(也可以直接将方法存放在User类)
<div class="codetitle"><a style="CURSOR: pointer" data="48346" class="copybut" id="copybut48346" onclick="doCopy('code48346')"> 代码如下:
<div class="codebody" id="code48346">
interface IUser{
function getName();
function getAge();
}
class User implements IUser{
protected $_group;
protected $_name;
protected $_age;
function __construct($name,$age,$group){
$this->_group = $group;
$this->_name = $name;
$this->_age = (int)$age;
}
function getName(){
return $this->_name;
}
function getAge(){
return $this->_age;
}
}
class Fuser{
private static $group = array(
array(‘小明‘,‘学生‘),
array(‘小王‘,‘学生‘)
);
static function create($id){
list($name,$group) = self::$group[(int)$id];
return new User($name,$group);
}
}
echo Fuser::create(0)->getName();

得到的结果应该是输出“小明”。

原文地址:https://www.jb51.cc/php/26193.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐