php factory interface,PHP设计模式之工厂方法*解读
「PHP」工廠方法是針對(duì)每一種產(chǎn)品提供一個(gè)工廠類。通過不同的工廠實(shí)例來創(chuàng)建不同的產(chǎn)品實(shí)例。
相比簡(jiǎn)單工廠 ,創(chuàng)建對(duì)象這件事不再交由一個(gè)類來創(chuàng)建:把簡(jiǎn)單工廠拆分,每個(gè)產(chǎn)品由專門的一個(gè)簡(jiǎn)單工廠來實(shí)現(xiàn),每個(gè)簡(jiǎn)單工廠實(shí)現(xiàn)工廠接口類。這樣實(shí)現(xiàn)在同一等級(jí)結(jié)構(gòu)中,支持增加任意產(chǎn)品。
工廠方法UML圖:
簡(jiǎn)單工廠需要有4個(gè)角色:
Product接口類:用于定義產(chǎn)品規(guī)范;
具體的產(chǎn)品實(shí)現(xiàn),例如ConcreateProductA、ConcreateProductB;
抽象工廠類IFactory:用于規(guī)范工廠;
具體產(chǎn)品創(chuàng)建的簡(jiǎn)單工廠,例如ConcreateFactoryA、ConcreateFactoryB。
代碼: ICar.php:定義產(chǎn)品規(guī)范:
namespace Yjc\SimpleFactory;
interface ICar
{
public function driver();
}
具體產(chǎn)品實(shí)現(xiàn):
namespace Yjc\SimpleFactory;
class Benz implements ICar
{
public function driver()
{
echo 'benz driver.';
}
}
class Bmw implements ICar
{
public function driver()
{
echo 'bmw driver.';
}
}
抽象工廠類IFactory:
namespace Yjc\Factory;
interface IFactory
{
public static function makeCar();
}
具體工廠實(shí)現(xiàn):
namespace Yjc\Factory;
class FactoryBenz implements IFactory
{
public static function makeCar()
{
return new Benz();
}
}
class FactoryBmw implements IFactory
{
public static function makeCar()
{
return new Bmw();
}
}
測(cè)試:
$car = Factory\FactoryBenz::makeCar();
$car->driver();
思考:如果不使用工廠模式來實(shí)現(xiàn)我們的例子,也許代碼會(huì)減少很多——只需要實(shí)現(xiàn)已有的車,不使用多態(tài)。但是在可維護(hù)性上,可擴(kuò)展性上是非常差的(你可以想象一下添加一輛車后要牽動(dòng)的類)。因此為了提高擴(kuò)展性和維護(hù)性,多寫些代碼是值得的,尤其是復(fù)雜項(xiàng)目里。
優(yōu)點(diǎn):
工廠方法模式就很好的減輕了工廠類的負(fù)擔(dān),把某一類/某一種東西交由一個(gè)工廠生產(chǎn);(對(duì)應(yīng)簡(jiǎn)單工廠的缺點(diǎn)1)
同時(shí)增加某一類”東西“并不需要修改工廠類,只需要添加生產(chǎn)這類”東西“的工廠即可,使得工廠類符合開放-封閉原則。
缺點(diǎn):
相比簡(jiǎn)單工廠,實(shí)現(xiàn)略復(fù)雜。
對(duì)于某些可以形成產(chǎn)品族的情況處理比較復(fù)雜。
對(duì)于缺點(diǎn)2,我們可以借用[抽象工廠]來實(shí)現(xiàn)。
總結(jié)
以上是生活随笔為你收集整理的php factory interface,PHP设计模式之工厂方法*解读的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java try catch 例子_ja
- 下一篇: JAVA入门级教学之(局部内部类)