作用:
定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類。Factory Method 使一個(gè)類的實(shí)例化延遲到其子類。
UML結(jié)構(gòu)圖:

抽象基類:
1)Product:創(chuàng)建出來(lái)的對(duì)象的抽象基類.
2)Factory創(chuàng)建對(duì)象的工廠方法的抽象基類.
接口函數(shù):
1)Creator::FactoryMethod:純虛函數(shù),由派生類實(shí)現(xiàn),創(chuàng)建出對(duì)應(yīng)的Product.
解析:
在這個(gè)模式中,有兩個(gè)抽象基類,一個(gè)是Product為創(chuàng)建出來(lái)的對(duì)象的抽象基類,一個(gè)是Factory是工廠的抽象基類,在互相協(xié)作的時(shí)候都是由相應(yīng)的Factory派生類來(lái)生成Product的派生類,也就是說(shuō)如果要新增一種Product那么也要對(duì)應(yīng)的新增一個(gè)Factory,創(chuàng)建的過(guò)程委托給了這個(gè)Factory.也就是說(shuō)一個(gè)Factory和一個(gè)Product是一一對(duì)應(yīng)的關(guān)系.
備注:
設(shè)計(jì)模式的演示圖上把Factory類命名為Creator,下面的實(shí)現(xiàn)沿用了這個(gè)命名.
演示實(shí)現(xiàn):
1)Factory.h

/**//********************************************************************
????created:????2006/06/30
????filename:?????Factory.h
????author:????????李創(chuàng)
????????????????http://www.shnenglu.com/converse/

????purpose:????Factory模式的演示代碼
*********************************************************************/

#ifndef?FACTORY_H
#define?FACTORY_H

class?Product


{
public:

????Product()
{}

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

class?ConcreateProduct
????:?public?Product


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

class?Creator


{
public:

????Creator()
{}

????virtual?~Creator()
{}

????void?AnOperation();

protected:
????virtual?Product*?FactoryMethod()?=?0;
};

class?ConcreateCreator
????:?public?Creator


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

protected:
????virtual?Product*?FactoryMethod();
};

#endif

2)Factory.cpp

/**//********************************************************************
????created:????2006/06/30
????filename:?????Factory.cpp
????author:????????李創(chuàng)
????????????????http://www.shnenglu.com/converse/

????purpose:????Factory模式的演示代碼
*********************************************************************/
#include?"Factory.h"
#include?<iostream>

using?namespace?std;

ConcreateProduct::ConcreateProduct()


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

ConcreateProduct::~ConcreateProduct()


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

void?Creator::AnOperation()


{
????Product*?p?=?FactoryMethod();

????std::cout?<<?"an?operation?of?product\n";
}

ConcreateCreator::ConcreateCreator()


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

ConcreateCreator::~ConcreateCreator()


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

Product*?ConcreateCreator::FactoryMethod()


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

3)Main.cpp(測(cè)試代碼)

/**//********************************************************************
????created:????2006/06/30
????filename:?????Main.cpp
????author:????????李創(chuàng)
????????????????http://www.shnenglu.com/converse/

????purpose:????測(cè)試Factory模式的代碼
*********************************************************************/

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

int?main(int?argc,char*?argv[])


{
????Creator?*p?=?new?ConcreateCreator();
????p->AnOperation();

????delete?p;

????system("pause");

????return?0;
}


