設計模式筆記之---抽象工廠模式

抽象工廠模式(Abstract Factory):提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。

       抽象工廠模式最大的好處是便於交換產品系列,由於具體工廠類只在初始化的時候出現一次,這就使得改變一個應用的具體工廠變得非常容易,它只需改變具體的工廠即可使用不同的產品配置。同時,它讓具體的創建實例的過程與客戶端分離,客戶端是通過它們的抽象接口操作實例,產品的具體類名也被具體工廠的實現分離,不會出現在客戶代碼中,從而完全遵循了開發--封閉原則和依賴倒裝原則。

UML類圖:

                   

抽象工廠模式基本代碼如下:

/********************************************************************
filename: 	AbstractFactory.h
created:	2012-09-24
author:		firehood

purpose:	firehood 學設計模式之---抽象工廠模式
*********************************************************************/
#pragma once
#include <iostream>  
using namespace std;  

// 抽象產品A
class AbstractProductA
{
public:
	AbstractProductA(void){}
	virtual ~AbstractProductA(void){}
};

// 具體產品A1,抽象產品A的第一種實現
class ConcreteProductA1:public AbstractProductA
{
public:
	ConcreteProductA1(void)
	{  
		cout<<"生產產品A1"<<endl;  
	}  
	virtual ~ConcreteProductA1(void)
	{  
		cout<<"銷燬產品A1"<<endl;  
	}  
};

// 具體產品A2,抽象產品A的第二種實現
class ConcreteProductA2:public AbstractProductA
{
public:
	ConcreteProductA2(void)
	{  
		cout<<"生產產品A2"<<endl;  
	}  
	virtual ~ConcreteProductA2(void)
	{  
		cout<<"銷燬產品A2"<<endl;  
	}  
};

// 抽象產品B
class AbstractProductB
{
public:
	AbstractProductB(void){}
	virtual ~AbstractProductB(void){}
};

// 具體產品B1,抽象產品B的第一種實現
class ConcreteProductB1:public AbstractProductB
{
public:
	ConcreteProductB1(void)
	{  
		cout<<"生產產品B1"<<endl;  
	}  
	virtual ~ConcreteProductB1(void)
	{  
		cout<<"銷燬產品B1"<<endl;  
	}  
};

// 具體產品B2,抽象產品B的第二種實現
class ConcreteProductB2:public AbstractProductB
{
public:
	ConcreteProductB2(void)
	{  
		cout<<"生產產品B2"<<endl;  
	}  
	virtual ~ConcreteProductB2(void)
	{  
		cout<<"銷燬產品B2"<<endl;  
	}  
};

// 抽象工廠
class AbstractFactory
{
public:
	AbstractFactory(void){}
	virtual ~AbstractFactory(void){}
	virtual AbstractProductA* CreateProductA() = 0;
	virtual AbstractProductB* CreateProductB() = 0;
};

// 具體工廠1
class ConcreteFactory1:public AbstractFactory
{
public:
	ConcreteFactory1(void)
	{  
		cout<<"創建工廠1"<<endl;  
	}  
	virtual ~ConcreteFactory1(void)
	{  
		cout<<"銷燬工廠1"<<endl;  
	}  
	virtual AbstractProductA* CreateProductA()
	{
		// 創建產品A1
		return new ConcreteProductA1();
	}
	virtual AbstractProductB* CreateProductB()
	{
		// 創建產品B1
		return new ConcreteProductB1();
	}
};

// 具體工廠2
class ConcreteFactory2:public AbstractFactory
{
public:
	ConcreteFactory2(void)
	{  
		cout<<"創建工廠2"<<endl;  
	}  
	virtual ~ConcreteFactory2(void)
	{  
		cout<<"銷燬工廠2"<<endl;  
	}  
	virtual AbstractProductA* CreateProductA()
	{
		// 創建產品A2
		return new ConcreteProductA2();
	}
	virtual AbstractProductB* CreateProductB()
	{
		// 創建產品B2
		return new ConcreteProductB2();
	}
};
客戶端調用代碼如下:

#include "AbstractFactory.h"
#include <iostream>
using namespace std;

int main(int argc,char* argv[])
{
	cout<<"*************************************"<<endl;
	cout<<"firehood 學設計模式之---抽象工廠模式"<<endl;
	cout<<"*************************************"<<endl;
    AbstractFactory *factory = new ConcreteFactory1();
	//AbstractFactory *factory = new ConcreteFactory2();
    AbstractProductA *productA = factory->CreateProductA();
	AbstractProductB *productB = factory->CreateProductB();

	delete productA;
	delete productB;
	delete factory;
    system("pause");
	return 0;
}
運行結果如下:

*************************************
firehood 學設計模式之---抽象工廠模式
*************************************
創建工廠1
生產產品A1
生產產品B1
銷燬產品A1
銷燬產品B1
銷燬工廠1
請按任意鍵繼續. . .

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章