解析PHP工廠模式的好處
更新時(shí)間:2013年06月18日 16:25:44 作者:
本篇文章是對(duì)PHP工廠模式的好處進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
顧名思義,工廠是可以加工零件的,PHP程序中的工廠模式也有相同的功能,可以方便的使用一個(gè)靜態(tài)的工廠方法來實(shí)例化某一個(gè)類,那么這樣做的好處是什么呢?初學(xué)PHP的設(shè)計(jì)模式,以下是我個(gè)人的理解
一般我們實(shí)例化一個(gè)類會(huì)給它一些參數(shù)以便在其構(gòu)析的時(shí)候可以根據(jù)不同的參數(shù)反饋出我們需要的結(jié)果。
舉例說明,以下是一個(gè)User類,非常簡單:
<?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;
}
}
?>
我們?nèi)绻獙?shí)例化這個(gè)類就要這樣:
$u = new User(‘小明‘,19);
一般如果這個(gè)類很少使用,那么這樣做沒什么太大影響,也非常好。
突然我想給這個(gè)類增加一個(gè)歸類,把小明放入學(xué)生組,修改下類代碼實(shí)現(xiàn)非常容易,但如果這個(gè)類在我們想修改之前在很多文件地方多次的實(shí)例化了,那么想為其增加一個(gè)參數(shù)就會(huì)變的非常煩瑣,因?yàn)樾枰鎿Q成:
$u = new User(‘小明‘,19,‘學(xué)生‘);
當(dāng)然我們也可以通過在__construct函數(shù)中進(jìn)行默認(rèn)值設(shè)置來避免這種重復(fù)勞動(dòng),但事實(shí)上從代碼優(yōu)雅角度來說這樣很不好,設(shè)想我們有一個(gè)工廠方法可以通過一個(gè)標(biāo)識(shí)來對(duì)應(yīng)一組參數(shù),并把這個(gè)參數(shù)存放在某個(gè)文本文檔或是直接以數(shù)組的形式存放在工廠類中,我們?cè)谡{(diào)用User類的時(shí)候就會(huì)變的輕松許多,即便是需要增減參數(shù)屬性也不需要到處進(jìn)行代碼的替換,下面就是一個(gè)工廠類(也可以直接將方法存放在User類)
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(‘小明‘,19,‘學(xué)生‘),
array(‘小王‘,19,‘學(xué)生‘)
);
static function create($id){
list($name, $age, $group) = self::$group[(int)$id];
return new User($name, $age, $group);
}
}
echo Fuser::create(0)->getName();
得到的結(jié)果應(yīng)該是輸出“小明”。
一般我們實(shí)例化一個(gè)類會(huì)給它一些參數(shù)以便在其構(gòu)析的時(shí)候可以根據(jù)不同的參數(shù)反饋出我們需要的結(jié)果。
舉例說明,以下是一個(gè)User類,非常簡單:
復(fù)制代碼 代碼如下:
<?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;
}
}
?>
我們?nèi)绻獙?shí)例化這個(gè)類就要這樣:
$u = new User(‘小明‘,19);
一般如果這個(gè)類很少使用,那么這樣做沒什么太大影響,也非常好。
突然我想給這個(gè)類增加一個(gè)歸類,把小明放入學(xué)生組,修改下類代碼實(shí)現(xiàn)非常容易,但如果這個(gè)類在我們想修改之前在很多文件地方多次的實(shí)例化了,那么想為其增加一個(gè)參數(shù)就會(huì)變的非常煩瑣,因?yàn)樾枰鎿Q成:
$u = new User(‘小明‘,19,‘學(xué)生‘);
當(dāng)然我們也可以通過在__construct函數(shù)中進(jìn)行默認(rèn)值設(shè)置來避免這種重復(fù)勞動(dòng),但事實(shí)上從代碼優(yōu)雅角度來說這樣很不好,設(shè)想我們有一個(gè)工廠方法可以通過一個(gè)標(biāo)識(shí)來對(duì)應(yīng)一組參數(shù),并把這個(gè)參數(shù)存放在某個(gè)文本文檔或是直接以數(shù)組的形式存放在工廠類中,我們?cè)谡{(diào)用User類的時(shí)候就會(huì)變的輕松許多,即便是需要增減參數(shù)屬性也不需要到處進(jìn)行代碼的替換,下面就是一個(gè)工廠類(也可以直接將方法存放在User類)
復(fù)制代碼 代碼如下:
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(‘小明‘,19,‘學(xué)生‘),
array(‘小王‘,19,‘學(xué)生‘)
);
static function create($id){
list($name, $age, $group) = self::$group[(int)$id];
return new User($name, $age, $group);
}
}
echo Fuser::create(0)->getName();
得到的結(jié)果應(yīng)該是輸出“小明”。
您可能感興趣的文章:
- php設(shè)計(jì)模式 Strategy(策略模式)
- 學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)策略模式(strategy)
- PHP實(shí)現(xiàn)的策略模式簡單示例
- php設(shè)計(jì)模式之策略模式應(yīng)用案例詳解
- PHP設(shè)計(jì)模式之策略模式原理與用法實(shí)例分析
- PHP最常用的2種設(shè)計(jì)模式工廠模式和單例模式介紹
- php設(shè)計(jì)模式 Factory(工廠模式)
- php設(shè)計(jì)模式之適配器模式原理、用法及注意事項(xiàng)詳解
- PHP使用觀察者模式處理異常信息的方法詳解
- php設(shè)計(jì)模式之單例模式用法經(jīng)典示例分析
- php設(shè)計(jì)模式之職責(zé)鏈模式定義與用法經(jīng)典示例
- php策略模式簡單示例分析【區(qū)別于工廠模式】
相關(guān)文章
淺析memcache啟動(dòng)以及telnet命令詳解
本篇文章是對(duì)memcache啟動(dòng)以及telnet命令進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06php獲取后臺(tái)Job管理的實(shí)現(xiàn)代碼
從數(shù)據(jù)庫中取出job 隊(duì)列 創(chuàng)建新的進(jìn)程進(jìn)行執(zhí)行 等待job 結(jié)束2011-06-06thinkPHP5實(shí)現(xiàn)的查詢數(shù)據(jù)庫并返回json數(shù)據(jù)實(shí)例
這篇文章主要介紹了thinkPHP5實(shí)現(xiàn)的查詢數(shù)據(jù)庫并返回json數(shù)據(jù)功能,結(jié)合實(shí)例形式分析了thinkPHP5數(shù)據(jù)庫查詢及json格式數(shù)據(jù)簡單操作技巧,需要的朋友可以參考下2017-10-10PHP實(shí)現(xiàn)自動(dòng)識(shí)別Restful API的返回內(nèi)容類型
這篇文章主要介紹了PHP實(shí)現(xiàn)自動(dòng)識(shí)別Restful API的返回內(nèi)容類型,并實(shí)現(xiàn)自動(dòng)自動(dòng)渲染成 json、xml、html、serialize、csv、php等數(shù)據(jù)格式輸出,需要的朋友可以參考下2015-02-02