工廠模式的最大優(yōu)點(diǎn)在于創(chuàng)建對(duì)象上面,就是把創(chuàng)建對(duì)象的過程封裝起來,這樣隨時(shí)可以產(chǎn)生一個(gè)新的對(duì)象。減少代碼進(jìn)行復(fù)制粘帖,耦合關(guān)系重,牽一發(fā)動(dòng)其他部分代碼。
工廠模式的三種形式:
1、簡(jiǎn)單工廠模式
interface person{
function eat();
function drink();
}
class Woman implements person{
function eat(){
echo "woman 吃飯";
}
function drink(){
echo "woman 喝水";
}
}
class Man implements person{
function eat(){
echo "man 吃飯";
}
function drink(){
echo "man 喝水";
}
}
class Factory{
function createObj($type){
return new $type;
}
}
$obj = new Factory();
$man = $obj->createObj('Man');
$man->eat();
$woman = $obj->createObj('Woman');
$woman->eat();
2、工廠模式
interface person{
function eat();
function drink();
}
class Woman implements person{
function eat(){
echo "woman 吃飯";
}
function drink(){
echo "woman 喝水";
}
}
class Man implements person{
function eat(){
echo "man 吃飯";
}
function drink(){
echo "man 喝水";
}
}
interface obj{
function create();
}
class WomanObj implements obj{
function create(){
return new Woman();
}
}
class ManObj implements obj{
function create(){
return new Man();
}
}
class Factory{
function getObj(){
$woman = new WomanObj();
$wobj = $woman->create();
$wobj->eat();
$Man = new ManObj();
$Mobj = $Man->create();
$Mobj->eat();
}
}
$obj = new Factory();
$obj->getObj();
3、抽象工廠
interface person{
function eat();
function drink();
}
class Woman implements person{
function eat(){
echo "woman 吃飯";
}
function drink(){
echo "woman 喝水";
}
}
class Iwoman implements person{
function eat(){
echo "內(nèi)向 woman 吃飯 放不開";
}
function drink(){
echo "內(nèi)向 woman 喝水 放不開";
}
}
class Man implements person{
function eat(){
echo "man 吃飯";
}
function drink(){
echo "man 喝水";
}
}
abstract class create{
abstract public function createObj();
abstract public function createIobj();
}
class Wobj extends create{
public function createObj(){
return new Woman();
}
public function createIobj(){
return new Iwoman();
}
}
$obj = new Wobj();
$woman = $obj->createObj();
$woman->eat();
echo "<br/>";
$woman = $obj->createIobj();
$woman->eat();
區(qū)別:
簡(jiǎn)單工廠模式:用來生產(chǎn)同一等級(jí)結(jié)構(gòu)中的任意產(chǎn)品。對(duì)與增加新的產(chǎn)品,無能為力
工廠模式 :用來生產(chǎn)同一等級(jí)結(jié)構(gòu)中的固定產(chǎn)品。(支持增加任意產(chǎn)品)
抽象工廠 :用來生產(chǎn)不同產(chǎn)品族的全部產(chǎn)品。(對(duì)于增加新的產(chǎn)品,無能為力;支持增加產(chǎn)品族)
簡(jiǎn)單工廠模式:工廠類負(fù)責(zé)創(chuàng)建的對(duì)象較少,客戶只知道傳入工廠類的參數(shù),對(duì)于如何創(chuàng)建對(duì)象不關(guān)心。
工廠方法模式:當(dāng)一個(gè)類不知道它所必須創(chuàng)建對(duì)象的類或一個(gè)類希望由子類來指定它所創(chuàng)建的對(duì)象時(shí),當(dāng)類將創(chuàng)建對(duì)象的職責(zé)委托給多個(gè)幫助子類中得某一個(gè),并且你希望將哪一個(gè)幫助子類是代理者這一信息局部化的時(shí)候,可以使用工廠方法模式。
抽象工廠模式:一個(gè)系統(tǒng)不應(yīng)當(dāng)依賴于產(chǎn)品類實(shí)例何如被創(chuàng)建,組合和表達(dá)的細(xì)節(jié),這對(duì)于所有形態(tài)的工廠模式都是重要的。這個(gè)系統(tǒng)有多于一個(gè)的產(chǎn)品族,而系統(tǒng)只消費(fèi)其 中某一產(chǎn)品族。同屬于同一個(gè)產(chǎn)品族的產(chǎn)品是在一起使用的,這一約束必須在系統(tǒng)的設(shè)計(jì)中體現(xiàn)出來。系統(tǒng)提供一個(gè)產(chǎn)品類的庫,所有的產(chǎn)品以同樣的接口出現(xiàn),從 而使客戶端不依賴于實(shí)現(xiàn)。
不管何種方式,根據(jù)具體的業(yè)務(wù)來定,達(dá)到最大程度的代碼復(fù)用。