設計模式系列(11)抽象工廠模式
阿新 • • 發佈:2019-01-29
1.概念
北方香蕉或蘋果或梨子
重要區別:
抽象工廠可以生產一個產品族(裡面有很多產品組成)
2.模式中包含的角色及其職責
1).抽象工廠(Creator)角色:抽象工廠模式的核心,包含對多個產品結構的宣告,任何工廠類都必須實現這個介面。
2).具體工廠(Concreter Creator)角色:具體工廠類是抽象工廠的一個實現,負責例項化某個產品族中的產品。
3).抽象(Product)角色:抽象模式所建立的所有物件的父類,它負責描述所有例項所有公共的介面。
抽象工廠模式是所有形態的工廠模式中最為抽象最為一般性的。抽象工廠模式可以向客戶端提供一個介面,使得客戶端在不必指定產品具體型別的情況下,能夠建立多個產品族的產品物件。
備註:工廠模式要麼生產香蕉、要麼生產蘋果、要麼生產西紅柿;但是不能生產一個產品組。抽象工廠能夠生產一個產品組。
解釋:具體工廠在開閉原則下,能生產香蕉或者蘋果或者梨子(產品等級結構)
抽象工廠在開閉原則下,能生產南方香蕉或南方蘋果或南方梨子(產品族)北方香蕉或蘋果或梨子
重要區別:
工廠模式只能生產一個產品。(要麼香蕉,要麼蘋果)
2.模式中包含的角色及其職責
1).抽象工廠(Creator)角色:抽象工廠模式的核心,包含對多個產品結構的宣告,任何工廠類都必須實現這個介面。
2).具體工廠(Concreter Creator)角色:具體工廠類是抽象工廠的一個實現,負責例項化某個產品族中的產品。
3).抽象(Product)角色:抽象模式所建立的所有物件的父類,它負責描述所有例項所有公共的介面。
4).具體產品(Concrete Product)角色:抽象模式所建立的具體例項物件。
抽象工廠UML類圖
3.示例程式碼:
abstractfactory.h
main.cpp#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_*/
#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;
}