作用:
提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴(lài)對(duì)象的接口,而無(wú)需指定它們具體的類(lèi)。
UML結(jié)構(gòu)圖:

抽象基類(lèi):
1)ProductA,ProductB:分別代表不同類(lèi)型的產(chǎn)品,而它們的派生類(lèi)則是這種產(chǎn)品的一個(gè)實(shí)現(xiàn).
2)AbstractFactory:生產(chǎn)這一系列產(chǎn)品的一個(gè)抽象工廠,它的派生類(lèi)是不同的實(shí)現(xiàn).
接口函數(shù):
1)AbstractFactory::CreateProductA和AbstractFactory::CreateProductB:分別是生產(chǎn)不同產(chǎn)品的不同的實(shí)現(xiàn),由各個(gè)派生出來(lái)的抽象工廠實(shí)現(xiàn)之.
解析:
Abstract Factory模式和Factory最大的差別就是抽象工廠創(chuàng)建的是一系列相關(guān)的對(duì)象,其中創(chuàng)建的實(shí)現(xiàn)其實(shí)采用的就是Factory模式的方法,對(duì)于某個(gè)實(shí)現(xiàn)的有一個(gè)派生出來(lái)的抽象工廠,另一個(gè)實(shí)現(xiàn)有另一個(gè)派生出來(lái)的工廠,等等.
可以舉一個(gè)簡(jiǎn)單的例子來(lái)解釋這個(gè)模式:比如,同樣是雞腿(ProductA)和漢堡(ProductB),它們都可以有商店出售(AbstractFactory),但是有不同的實(shí)現(xiàn),有肯德基(ConcreateFactory1)和麥當(dāng)勞(ConcreateFactory2)兩家生產(chǎn)出來(lái)的不同風(fēng)味的雞腿和漢堡(也就是ProductA和ProductB的不同實(shí)現(xiàn)).
而負(fù)責(zé)生產(chǎn)漢堡和雞腿的就是之前提過(guò)的Factory模式了.
抽象工廠需要特別注意的地方就是區(qū)分不同類(lèi)型的產(chǎn)品和這些產(chǎn)品的不同實(shí)現(xiàn).顯而易見(jiàn)的,如果有n種產(chǎn)品同時(shí)有m中不同的實(shí)現(xiàn),那么根據(jù)乘法原理可知有n*m個(gè)Factory模式的使用.
實(shí)現(xiàn):
1)AbstractFactory.h

/**//********************************************************************
????created:????2006/07/19
????filename:?????AbstractFactory.h
????author:????????李創(chuàng)
????????????????http://m.shnenglu.com/converse/

????purpose:????AbstractFactory的演示代碼
*********************************************************************/

#ifndef?ABSTRACTFACTORY_H
#define?ABSTRACTFACTORY_H

//?抽象基類(lèi)AbstractProductA,代表產(chǎn)品A的抽象
class?AbstractProductA


{
public:

????AbstractProductA()?
{}

????virtual?~AbstractProductA()
{};
};

//?派生類(lèi)ConcreateProductA1,繼承自AbstractProductA,代表產(chǎn)品A的第一種實(shí)現(xiàn)
class?ConcreateProductA1
????:?public?AbstractProductA


{
public:
????ConcreateProductA1();
????virtual?~ConcreateProductA1();
};

//?派生類(lèi)ConcreateProductA2,繼承自AbstractProductA,代表產(chǎn)品A的第二種實(shí)現(xiàn)
class?ConcreateProductA2
????:?public?AbstractProductA


{
public:
????ConcreateProductA2();
????virtual?~ConcreateProductA2();
};

//?抽象基類(lèi)AbstractProductB,代表產(chǎn)品B的抽象
class?AbstractProductB


{
public:

????AbstractProductB()?
{}

????virtual?~AbstractProductB()
{};
};

//?派生類(lèi)ConcreateProductB1,繼承自AbstractProductB,代表產(chǎn)品B的第一種實(shí)現(xiàn)
class?ConcreateProductB1
????:?public?AbstractProductB


{
public:
????ConcreateProductB1();
????virtual?~ConcreateProductB1();
};

//?派生類(lèi)ConcreateProductB2,繼承自AbstractProductB,代表產(chǎn)品B的第二種實(shí)現(xiàn)
class?ConcreateProductB2
????:?public?AbstractProductB


{
public:
????ConcreateProductB2();
????virtual?~ConcreateProductB2();
};

//?抽象基類(lèi)AbstractFactory,工廠的抽象類(lèi),生產(chǎn)產(chǎn)品A和產(chǎn)品B
class?AbstractFactory


{
public:

????AbstractFactory()
{}

????virtual?~AbstractFactory()
{}

????virtual?AbstractProductA*?CreateProductA()?=?0;
????virtual?AbstractProductB*?CreateProductB()?=?0;
};

//?派生類(lèi)ConcreateFactory1,繼承自AbstractFactory
//?生產(chǎn)產(chǎn)品A和產(chǎn)品B的第一種實(shí)現(xiàn)
class?ConcreateFactory1
????:?public?AbstractFactory


{
public:
????ConcreateFactory1();
????virtual?~ConcreateFactory1();

????virtual?AbstractProductA*?CreateProductA();
????virtual?AbstractProductB*?CreateProductB();
};

//?派生類(lèi)ConcreateFactory2,繼承自AbstractFactory
//?生產(chǎn)產(chǎn)品A和產(chǎn)品B的第二種實(shí)現(xiàn)
class?ConcreateFactory2
????:?public?AbstractFactory


{
public:
????ConcreateFactory2();
????virtual?~ConcreateFactory2();

????virtual?AbstractProductA*?CreateProductA();
????virtual?AbstractProductB*?CreateProductB();
};

#endif2)AbstractFactory.cpp

/**//********************************************************************
????created:????2006/07/19
????filename:?????AbstractFactory.cpp
????author:????????李創(chuàng)
????????????????http://m.shnenglu.com/converse/

????purpose:????AbstractFactory的演示代碼
*********************************************************************/

#include?<iostream>
#include?"AbstractFactory.h"

ConcreateProductA1::ConcreateProductA1()


{
????std::cout?<<?"construction?of?ConcreateProductA1\n";
}

ConcreateProductA1::~ConcreateProductA1()


{
????std::cout?<<?"destruction?of?ConcreateProductA1\n";
}

ConcreateProductA2::ConcreateProductA2()


{
????std::cout?<<?"construction?of?ConcreateProductA2\n";
}

ConcreateProductA2::~ConcreateProductA2()


{
????std::cout?<<?"destruction?of?ConcreateProductA2\n";
}

ConcreateProductB1::ConcreateProductB1()


{
????std::cout?<<?"construction?of?ConcreateProductB1\n";
}

ConcreateProductB1::~ConcreateProductB1()


{
????std::cout?<<?"destruction?of?ConcreateProductB1\n";
}

ConcreateProductB2::ConcreateProductB2()


{
????std::cout?<<?"construction?of?ConcreateProductB2\n";
}

ConcreateProductB2::~ConcreateProductB2()


{
????std::cout?<<?"destruction?of?ConcreateProductB2\n";
}

ConcreateFactory1::ConcreateFactory1()


{
????std::cout?<<?"construction?of?ConcreateFactory1\n";
}

ConcreateFactory1::~ConcreateFactory1()


{
????std::cout?<<?"destruction?of?ConcreateFactory1\n";
}

AbstractProductA*?ConcreateFactory1::CreateProductA()


{
????return?new?ConcreateProductA1();
}

AbstractProductB*?ConcreateFactory1::CreateProductB()


{
????return?new?ConcreateProductB1();
}

ConcreateFactory2::ConcreateFactory2()


{
????std::cout?<<?"construction?of?ConcreateFactory2\n";
}

ConcreateFactory2::~ConcreateFactory2()


{
????std::cout?<<?"destruction?of?ConcreateFactory2\n";
}

AbstractProductA*?ConcreateFactory2::CreateProductA()


{
????return?new?ConcreateProductA2();
}

AbstractProductB*?ConcreateFactory2::CreateProductB()


{
????return?new?ConcreateProductB2();
}3)Main.cpp(測(cè)試代碼)

/**//********************************************************************
????created:????2006/07/19
????filename:?????Main.cpp
????author:????????李創(chuàng)
????????????????http://m.shnenglu.com/converse/

????purpose:????AbstractFactory的測(cè)試代碼
*********************************************************************/

#include?"AbstractFactory.h"
#include?<stdlib.h>

int?main()


{
????//?生產(chǎn)產(chǎn)品A的第一種實(shí)現(xiàn)
????ConcreateFactory1?*pFactory1?=?new?ConcreateFactory1;
????AbstractProductA?*pProductA?=?pFactory1->CreateProductA();

????//?生產(chǎn)產(chǎn)品B的第二種實(shí)現(xiàn)
????ConcreateFactory2?*pFactory2?=?new?ConcreateFactory2;
????AbstractProductB?*pProductB?=?pFactory2->CreateProductB();

????delete?pFactory1;
????delete?pProductA;
????delete?pFactory2;
????delete?pProductB;

????system("pause");

????return?0;
}