真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

設(shè)計(jì)模式(三)——抽象工廠模式

設(shè)計(jì)模式(三)——抽象工廠模式

一、抽象工廠模式

1、抽象工廠模式簡(jiǎn)介

    定義:為創(chuàng)建一組相關(guān)或相互依賴的對(duì)象提供一個(gè)接口,而且無(wú)需指定他們的具體類。

成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)中從網(wǎng)站色彩、結(jié)構(gòu)布局、欄目設(shè)置、關(guān)鍵詞群組等細(xì)微處著手,突出企業(yè)的產(chǎn)品/服務(wù)/品牌,幫助企業(yè)鎖定精準(zhǔn)用戶,提高在線咨詢和轉(zhuǎn)化,使成都網(wǎng)站營(yíng)銷成為有效果、有回報(bào)的無(wú)錫營(yíng)銷推廣。創(chuàng)新互聯(lián)專業(yè)成都網(wǎng)站建設(shè)10多年了,客戶滿意度97.8%,歡迎成都創(chuàng)新互聯(lián)客戶聯(lián)系。

UML類圖:

設(shè)計(jì)模式(三)——抽象工廠模式

設(shè)計(jì)模式(三)——抽象工廠模式

2、抽象工廠模式角色

(1)抽象工廠AbstractFactory:抽象工廠類,提供創(chuàng)建兩種產(chǎn)品的接口CreateProductA和CreateProductB,由派生的各個(gè)具體工廠類對(duì)其實(shí)現(xiàn)

(2)具體工廠:包括具體工廠FactoryM和具體工廠FactoryN。具體工廠FactoryM用于生產(chǎn)具體產(chǎn)品MProductA和具體產(chǎn)品MProductB,具體工廠FactoryN用于生產(chǎn)具體產(chǎn)品NProductA和具體產(chǎn)品NProductB。

(3)抽象產(chǎn)品:AbstractProductA、AbstractProductB:分別代表兩種不同類型的產(chǎn)品,由具體的產(chǎn)品派生類對(duì)其實(shí)現(xiàn)

(4)具體產(chǎn)品:包括抽象產(chǎn)品AbstractProductA所對(duì)應(yīng)的具體產(chǎn)品MProductA和NProductA,抽象產(chǎn)品AbstractProductB所對(duì)應(yīng)的具體產(chǎn)品MProductB和NProductB。

3、抽象工廠模式優(yōu)缺點(diǎn)

 優(yōu)點(diǎn):抽象工廠模式是對(duì)工廠方法模式的改進(jìn),用于處理產(chǎn)品不只有一類的情況。抽象工廠模式除了具有工廠方法模式的優(yōu)點(diǎn)外,最主要的優(yōu)點(diǎn)就是可以在類的內(nèi)部對(duì)產(chǎn)品族進(jìn)行約束。所謂的產(chǎn)品族,一般或多或少的都存在一定的關(guān)聯(lián),抽象工廠模式就可以在類內(nèi)部對(duì)產(chǎn)品族的關(guān)聯(lián)關(guān)系進(jìn)行定義和描述,而不必專門引入一個(gè)新的類來(lái)進(jìn)行管理。

    抽象工廠模式分離了具體類,使得客戶與類的實(shí)現(xiàn)分離

缺點(diǎn):

    難以支持新種類的產(chǎn)品,不容易擴(kuò)展。產(chǎn)品族的擴(kuò)展將是一件十分費(fèi)力的事情,假如產(chǎn)品族中需要增加一個(gè)新的產(chǎn)品,則幾乎所有的工廠類都需要進(jìn)行修改。所以使用抽象工廠模式時(shí),對(duì)產(chǎn)品等級(jí)結(jié)構(gòu)的劃分是非常重要的。

    抽象工廠模式和工廠方法模式的區(qū)別就在于需要?jiǎng)?chuàng)建對(duì)象的復(fù)雜程度上。而且抽象工廠模式是三個(gè)里面最為抽象、最具一般性的。

4、抽象工廠模式使用場(chǎng)景

抽象工廠模式使用場(chǎng)景:

    A、當(dāng)需要?jiǎng)?chuàng)建的對(duì)象是一系列相互關(guān)聯(lián)或相互依賴的產(chǎn)品族時(shí),便可以使用抽象工廠模式。一個(gè)繼承體系中,如果存在著多個(gè)等級(jí)結(jié)構(gòu)(即存在著多個(gè)抽象類),并且分屬各個(gè)等級(jí)結(jié)構(gòu)中的實(shí)現(xiàn)類之間存在著一定的關(guān)聯(lián)或者約束,就可以使用抽象工廠模式。假如各個(gè)等級(jí)結(jié)構(gòu)中的實(shí)現(xiàn)類之間不存在關(guān)聯(lián)或約束,則使用多個(gè)獨(dú)立的工廠來(lái)對(duì)產(chǎn)品進(jìn)行創(chuàng)建,則更合適一點(diǎn)。

    B、 一個(gè)系統(tǒng)不應(yīng)當(dāng)依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建、組合和表達(dá)的細(xì)節(jié)。

    C、同屬于同一個(gè)產(chǎn)品族的產(chǎn)品是在一起使用的,約束必須在系統(tǒng)的設(shè)計(jì)中體現(xiàn)出來(lái)。

    D、系統(tǒng)提供一個(gè)產(chǎn)品類的庫(kù),所有的產(chǎn)品以同樣的接口出現(xiàn),從而使客戶端不依賴于實(shí)現(xiàn)。

二、抽象工廠模式實(shí)現(xiàn)

抽象工廠AbstractFactory類:
#ifndef ABSTRACTFACTORY_H
#define ABSTRACTFACTORY_H
 
class AbstractProductA;
class AbstractProductB;
class AbstractFactory
{
public:
    virtual AbstractProductA* createProductA() = 0;
    virtual AbstractProductB* createProductB() = 0;
};
 
#endif // ABSTRACTFACTORY_H
FactoryM工廠類:
#ifndef FACTORYM_H
#define FACTORYM_H
#include "AbstractFactory.h"
#include "MProductA.h"
#include "MProductB.h"
 
class FactoryM : public AbstractFactory
{
public:
    virtual AbstractProductA* createProductA()
    {
        AbstractProductA* product = new MProductA();
        return product;
    }
    virtual AbstractProductB* createProductB()
    {
        AbstractProductB* product = new MProductB();
        return product;
    }
};
 
#endif // FACTORYM_H
FactoryN工廠類:
#ifndef FACTORYN_H
#define FACTORYN_H
#include "AbstractFactory.h"
#include "NProductA.h"
#include "NProductB.h"
 
class FactoryN : public AbstractFactory
{
public:
    virtual AbstractProductA* createProductA()
    {
        AbstractProductA* product = new NProductA();
        return product;
    }
    virtual AbstractProductB* createProductB()
    {
        AbstractProductB* product = new NProductB();
        return product;
    }
};
 
#endif // FACTORYN_H
 
AbstractProductA抽象產(chǎn)品A類:
#ifndef ABSTRACTPRODUCTA_H
#define ABSTRACTPRODUCTA_H
 
class AbstractProductA
{
public:
    virtual void productMethod() = 0;
};
 
#endif // ABSTRACTPRODUCTA_H
MProductA產(chǎn)品類:
#ifndef MPRODUCTA_H
#define MPRODUCTA_H
#include "AbstractProductA.h"
#include 
using std::endl;
using std::cout;
 
class MProductA : public AbstractProductA
{
public:
    virtual void productMethod()
    {
        cout << "This is a MProductA by FactoryM" << endl;
    }
};
 
#endif // MPRODUCTA_H
 
NProductA產(chǎn)品類:
#ifndef NPRODUCTA_H
#define NPRODUCTA_H
#include "AbstractProductA.h"
#include 
using std::endl;
using std::cout;
 
class NProductA : public AbstractProductA
{
public:
    virtual void productMethod()
    {
        cout << "This is a NProductA by FactoryN" << endl;
    }
};
 
#endif // NPRODUCTA_H
 
AbstractProductB抽象產(chǎn)品B類:
#ifndef ABSTRACTPRODUCTB_H
#define ABSTRACTPRODUCTB_H
 
class AbstractProductB
{
public:
    virtual void productMethod() = 0;
};
 
#endif // ABSTRACTPRODUCTB_H
MProductB產(chǎn)品類:
#ifndef MPRODUCTB_H
#define MPRODUCTB_H
#include "AbstractProductB.h"
#include 
using std::endl;
using std::cout;
 
class MProductB : public AbstractProductB
{
public:
    virtual void productMethod()
    {
        cout << "This is a MProductB by FactoryM" << endl;
    }
};
 
#endif // MPRODUCTB_H
NProductB產(chǎn)品類:
#ifndef NPRODUCTB_H
#define NPRODUCTB_H
#include "AbstractProductB.h"
#include 
using std::endl;
using std::cout;
 
class NProductB : public AbstractProductB
{
public:
    virtual void productMethod()
    {
        cout << "This is a NProductB by FactoryN" << endl;
    }
};
 
#endif // NPRODUCTB_H
客戶調(diào)用程序:
#include 
#include "AbstractFactory.h"
#include "FactoryM.h"
#include "FactoryN.h"
 
using namespace std;
 
int main()
{
    AbstractFactory* factoryM = new FactoryM();
    AbstractProductA* mproductA = factoryM->createProductA();
    AbstractProductB* mproductB = factoryM->createProductB();
    mproductA->productMethod();
    mproductB->productMethod();
 
    AbstractFactory* factoryN = new FactoryN();
    AbstractProductA* nproductA = factoryN->createProductA();
    AbstractProductB* nproductB = factoryN->createProductB();
    nproductA->productMethod();
    nproductB->productMethod();
 
    delete factoryM;
    delete mproductA;
    delete mproductB;
 
    delete factoryN;
    delete nproductA;
    delete nproductB;
 
    return 0;
}

當(dāng)前名稱:設(shè)計(jì)模式(三)——抽象工廠模式
當(dāng)前鏈接:http://weahome.cn/article/jigegs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部