1. 程式人生 > >設計模式系列(11)抽象工廠模式

設計模式系列(11)抽象工廠模式

1.概念

  抽象工廠模式是所有形態的工廠模式中最為抽象最為一般性的。抽象工廠模式可以向客戶端提供一個介面,使得客端在不必指定產品具體型別的情況下,能夠建立多個產品族的產品物件。

備註:工廠模式要麼生產香蕉、要麼生產蘋果、要麼生產西紅柿;但是不能生產一個產品組。抽象工廠能夠生產一個產品組。

解釋:

具體工廠在開閉原則下,能生產香蕉或者蘋果或者梨子(產品等級結構)

抽象工廠在開閉原則下,能生產南方香蕉或南方蘋果或南方梨子(產品族)
                                                   北方香蕉或蘋果或梨子
重要區別:

工廠模式只能生產一個產品。(要麼香蕉,要麼蘋果)

抽象工廠可以生產一個產品族(裡面有很多產品組成)


2.模式中包含的角色及其職責
1).抽象工廠(Creator)角色:抽象工廠模式的核心,包含對多個產品結構的宣告,任何工廠類都必須實現這個介面。
2).具體工廠(Concreter Creator)角色:具體工廠類是抽象工廠的一個實現,負責例項化某個產品族中的產品。
3).抽象(Product)角色:抽象模式所建立的所有物件的父類,它負責描述所有例項所有公共的介面。

4).具體產品(Concrete Product)角色:抽象模式所建立的具體例項物件。

                       

               抽象工廠UML類圖

3.示例程式碼:

abstractfactory.h

#ifndef _ABSTRACTFACTORY_H_
#define _ABSTRACTFACTORY_H_

#include <iostream>

using namespace std;

class Fruit
{
public:
    virtual void SayName() = 0;
};

class AbstractFactory
{
public:
    virtual Fruit* CreateBanana() = 0;
    virtual Fruit* CreateApple() = 0;
};

class NorthBanana : public Fruit
{
public:
    virtual void SayName()
    {
        cout << "north banana" << endl;
    }
};

class NorthApple : public Fruit
{
public:
    virtual void SayName()
    {
        cout << "north apple" << endl;
    }
};

class SourthBanana : public Fruit
{
public:
    virtual void SayName()
    {
        cout << "Sourth banana" << endl;
    }
};

class SourthApple : public Fruit
{
public:
    virtual void SayName()
    {
        cout << "Sourth apple" << endl;
    }
};


class NorthFactory : public AbstractFactory
{
public:
    virtual Fruit* CreateBanana()
    {
        return new NorthBanana;
    }

    virtual Fruit* CreateApple()
    {
        return new NorthApple;
    }
};

class SourthFactory : public AbstractFactory
{
public:
    virtual Fruit* CreateBanana()
    {
        return new SourthBanana;
    }

    virtual Fruit* CreateApple()
    {
        return new SourthApple;
    }
};

#endif /*_ABSTRACTFACTORY_H_*/
main.cpp
#include <iostream>
#include "abstractfactory.h"

using namespace std;

int main()
{
    Fruit *fruit = NULL;
    AbstractFactory *af = NULL;

    af = new SourthFactory;
    fruit = af->CreateApple();
    fruit->SayName();
    delete fruit;
    fruit = af->CreateBanana();
    fruit->SayName();
    delete fruit;

    af = new NorthFactory;
    fruit = af->CreateApple();
    fruit->SayName();
    delete fruit;
    fruit = af->CreateBanana();
    fruit->SayName();
    delete fruit;

    delete af;
    delete fruit;

    return 0;
}