工廠模式旨在創建具有間接引用的對象。例如,用戶應該能夠調用:
Node* node = Factory::createNode("MyNodeType");
如果能夠創造這樣一個節點一個工廠,那麼函數的指針到MyNodeType
對象返回。否則,它返回NULL。
爲了使此功能起作用,必須註冊一個Factory
,它可以構造MyNodeType
類型的對象。我們將不得不相信這樣的工廠會創建該類型的節點。
參與這一圖案中的類:
- 抽象基類
Node
。
- 抽象基類
Factory
。
- 具體子類
Node
調用MyNodeType
。
- 混凝土子類
Factory
。我們稱之爲MyNodeTypeFactory
。
這是一個這樣的骨架結構。
Node.h:
class Node
{
virtual ~Node() = 0;
};
Factor.h:
#include <string>
class Factory
{
public:
static void registerFactory(std::string const& productType,
Factory* factory);
static Node* creatNode(std::string const& productType);
private:
virtual Node* createNode();
};
Factory.cc:
#include <map>
typedef std::map<std::string, Factory*> FactoryMap;
static FactoryMap& getFactoryMap()
{
static FactoryMap factoryMap;
return factoryMap;
}
static void registerFactory(std::string const& productType,
Factory* factory)
{
getFactoryMap()[productType] = factory;
}
static Node* creatNode(std::string const& productType)
{
FactoryMap& factoryMap = getFactoryMap();
FactoryMap::iterator iter = factoryMap.find(productType);
if (iter == factoryMap.end())
{
// Unknown product.
return NULL;
}
return iter->second->createNode();
}
MyNodeType.h:
#include "Node.h"
class MyNodeType : public Node
{
MyNodeType() {}
virtual ~MyNodeType() {}
};
個
MyNodeTypeFactory.h:
#include <Factory.h>
class MyNodeTypeFactory : public Factory
{
public:
virtual Node* createNode();
};
MyNodeTypeFactory.cc:
#include "MyNodeTypeFactory.h"
struct RegistrationHelper
{
MyNodeTypeFactorHelper()
{
Factory::registerFactory("MyNodeType", new MyNodeTypeFactory());
}
};
static RegistrationHelper helper;
Node* MyNodeTypeFactory::createNode()
{
return MyNodeType();
}
那麼,用戶應該如何使用這個工廠?你能舉一個想要的代碼的例子嗎?據我所知,他可以註冊一些type_,然後在一些算法或步驟期間,工廠開始根據註冊類型生成一些節點。我對麼? – zaufi
如果'CreateNode()'旨在從用戶*中抽象出來,也許它不應該是'public'? – Praetorian
正確,不應該。我創建了這個代碼來描述最簡單莊園中的問題。我應該把它改爲「SetType」,因爲工廠一次只能創建一種類型,「RegisterType」是誤導性的。 – KKlouzal