工廠方法模式不同於簡單工廠模式的地方在於工廠方法模式把對象的創建過程放到裏子類裏。這樣工廠父對象和產品父對象一樣,可以是抽象類或者接口,只定義相應的規範或操作,不涉及具體的創建或實現細節。
其類圖如下:
實例代碼爲:
#pragma once
class IProduct
{
public:
IProduct(void);
virtual ~IProduct(void);
};
#pragma once
#include "iproduct.h"
class IPad :
public IProduct
{
public:
IPad(void);
~IPad(void);
};
#pragma once
#include "iproduct.h"
class IPhone :
public IProduct
{
public:
IPhone(void);
~IPhone(void);
};
#pragma once
#include"IProduct.h"
class IFactory
{
public:
IFactory(void);
virtual ~IFactory(void);
virtual IProduct* getProduct();
};
#pragma once
#include "ifactory.h"
class IPadFactory :
public IFactory
{
public:
IPadFactory(void);
~IPadFactory(void);
virtual IProduct* getProduct();
};
#pragma once
#include "ifactory.h"
class IPhoneFactory :
public IFactory
{
public:
IPhoneFactory(void);
~IPhoneFactory(void);
virtual IProduct* getProduct();
};
關鍵的實現:
#include "StdAfx.h"
#include "IPadFactory.h"
#include"IPad.h"
IPadFactory::IPadFactory(void)
{
}
IPadFactory::~IPadFactory(void)
{
}
IProduct* IPadFactory::getProduct()
{
return new IPad();
}
#include "StdAfx.h"
#include "IPhoneFactory.h"
#include"IPhone.h"
IPhoneFactory::IPhoneFactory(void)
{
}
IPhoneFactory::~IPhoneFactory(void)
{
}
IProduct* IPhoneFactory::getProduct()
{
return new IPhone();
}
調用方式:
#include "stdafx.h"
#include"IFactory.h"
#include"IPadFactory.h"
#include"IPhoneFactory.h"
#include"IProduct.h"
int _tmain(int argc, _TCHAR* argv[])
{
IFactory *fac = new IPadFactory();
IProduct *pro = fac->getProduct();
fac = new IPhoneFactory();
pro = fac->getProduct();
return 0;
}
應用場景:
1. .net裏面的數據庫連接對象就是產生數據命令對象的工廠。每種數據庫的connection對象裏(繼承自IDbConnection)都有對自己createCommand(定義在IDbCommand裏)的實現。
2. .net裏面的迭代器,IEnumerable定義了迭代器的接口,即工廠方法,每一個繼承自IEnumerable的類都要實現GetEnumerator。可以參看ArrayList,String的GetEnumerator方法。他們都繼承自IEnumerable。
參考資料:
1.Dot Net設計模式—工廠方法模式 http://fineboy.cnblogs.com/archive/2005/08/04/207459.html
2.工廠方法模式 http://www.cnblogs.com/cbf4life/archive/2009/12/20/1628494.html
LCL_data原創於CSDN.Net【http://blog.csdn.net/lcl_data/article/details/8712834】