上一篇已經(jīng)描述了簡(jiǎn)單工廠的實(shí)現(xiàn),并對(duì)特點(diǎn)和問(wèn)題做了對(duì)比唾那,如果感興趣可以去看幢踏。
場(chǎng)景背景
經(jīng)過(guò)大家的努力搀矫,啃得雞的草莓冰淇淋和香草冰淇淋銷量不錯(cuò)。
準(zhǔn)備繼續(xù)販?zhǔn)坌碌谋苛墚a(chǎn)品纵菌,發(fā)現(xiàn)每次生產(chǎn)新產(chǎn)品時(shí),都要對(duì)之前的工廠(簡(jiǎn)單工廠)進(jìn)行改造休涤。
啃得雞害怕會(huì)影響產(chǎn)品品質(zhì)咱圆,希望設(shè)計(jì)一個(gè)發(fā)布新產(chǎn)品不會(huì)影響原產(chǎn)品生產(chǎn)的工廠。
代碼如何實(shí)現(xiàn)功氨?
場(chǎng)景分析
讓我們?cè)傧胍幌氡苛芄S的流水線吧闷堡;如何再不影響一個(gè)流水線的情況下,再多出一種產(chǎn)品嗯疑故?
造一條新的流水線去生產(chǎn)新產(chǎn)品杠览!
程序就是好,造流水線沒(méi)那么花錢纵势。
實(shí)現(xiàn)
實(shí)現(xiàn)類圖:
這時(shí)我們發(fā)現(xiàn)如果需要我們有了一個(gè)新冰淇淋(產(chǎn)品)踱阿,那么我們就安排一個(gè)新的生產(chǎn)線(工廠)。再也不會(huì)影響原了的冰淇淋生產(chǎn)情況了钦铁。
代碼
冰淇淋:
// 冰淇淋接口
class IceCreamInterface
{
public:
virtual ~IceCreamInterface() {}
virtual void taste() = 0;
};
// 草莓冰淇淋
class StrawberryIceCreamImpl : public IceCreamInterface
{
public:
virtual void taste() override
{
qDebug() << QStringLiteral("草莓冰淇淋的味道软舌!");
}
};
// 香草冰淇淋
class VanillaIceCreamImpl : public IceCreamInterface
{
public:
virtual void taste() override
{
qDebug() << QStringLiteral("香草冰淇淋的味道!");
}
};
冰淇淋工廠:
// 冰淇淋工廠接口
class IceCreamFactoryInterface
{
public:
virtual ~IceCreamFactoryInterface() {}
virtual IceCreamInterface * createIceCream() = 0;
};
// 草莓冰淇淋工廠
class StrawberryIceCreamFactory : public IceCreamFactoryInterface
{
public:
StrawberryIceCreamFactory() {}
IceCreamInterface * createIceCream()
{
return new StrawberryIceCreamImpl();
}
};
// 香草冰淇淋工廠
class VanillaIceCreamFactory : public IceCreamFactoryInterface
{
public:
VanillaIceCreamFactory() {}
IceCreamInterface * createIceCream()
{
return new VanillaIceCreamImpl();
}
};
客戶端:
int main(int argc, char *argv[])
{
IceCreamFactoryInterface* pStrawberryIceCreamFactory =
new StrawberryIceCreamFactory();
IceCreamFactoryInterface* pVanillaIceCreamFactory =
new VanillaIceCreamFactory();
IceCreamInterface* pStrawberryIceCream = pStrawberryIceCreamFactory->createIceCream();
IceCreamInterface* pVanillaIceCream = pVanillaIceCreamFactory->createIceCream();
pStrawberryIceCream->taste();
pVanillaIceCream->taste();
delete pStrawberryIceCreamFactory;
delete pVanillaIceCreamFactory;
delete pStrawberryIceCream;
delete pVanillaIceCream;
}
代碼位置:
https://github.com/su-dd/Demo_DesignPattern/tree/main/FactoryMethod
使用感悟
這里我們解決了簡(jiǎn)單工廠存在的問(wèn)題牛曹,符合開閉原則的增加產(chǎn)品生產(chǎn)佛点;
但是我們同時(shí)引入了新的問(wèn)題,客戶端使用起來(lái)很麻煩黎比,對(duì)應(yīng)到現(xiàn)實(shí)就是本來(lái)一個(gè)客戶去一個(gè)工廠能滿足所有的需求超营,現(xiàn)在客戶想要同時(shí)買到兩種冰淇淋就需要跑兩個(gè)場(chǎng);
所有現(xiàn)在我們需一個(gè)超市阅虫,或者小賣部演闭?
工廠模式的特點(diǎn):
1、工廠類可以不實(shí)例化颓帝,使用靜態(tài)工廠類米碰。
2窝革、隨著產(chǎn)品的增加,工廠也不斷的增加吕座,可能造成對(duì)象的爆發(fā)虐译。
3、客戶需要關(guān)注每個(gè)工廠的不同才能獲得想要的產(chǎn)品吴趴,可能增加維護(hù)成本菱蔬。
思考:
什么是產(chǎn)品,什么是工廠史侣?
由于產(chǎn)品和工廠兩個(gè)名稱的迷惑性拴泌,我們可能會(huì)下意識(shí)的把他們對(duì)應(yīng)到某個(gè)實(shí)體的映射。(這當(dāng)然是初學(xué)時(shí)最快的理解方式)
但產(chǎn)品和工廠的概念中惊橱,產(chǎn)品指的是類蚪腐;類可以是事物,關(guān)系等的抽象税朴。