// factory_method.cpp
#include <stdio.h>
#ifdef _X_RELEASE_
#define TRACE(str)
#else
#define TRACE(str) printf("%s/n", str)
#endif
// 产品抽象类,定义接口
class CProduct
{
public:
CProduct()
{
TRACE("CProduct");
}
virtual ~CProduct()
{
TRACE("~CProduct");
}
virtual void Operation() = 0;
};
// 具体产品类
class CConcreteProduct : public CProduct
{
public:
CConcreteProduct()
{
TRACE("CConcreteProduct");
}
virtual ~CConcreteProduct()
{
TRACE("~CConcreteProduct");
}
virtual void Operation()
{
TRACE("Operation");
}
};
// 工厂方法抽象类,创建CProduct类型的产品
class CCreator
{
private:
CProduct* m_pProduct;
public:
CCreator()
{
TRACE("CCreator");
m_pProduct = 0;
}
// m_pProduct在析构函数中释放
virtual ~CCreator()
{
TRACE("~CCreator");
if (m_pProduct)
{
delete m_pProduct;
m_pProduct = 0;
}
}
// FactoryMethod
virtual CProduct *CreateProduct() = 0;
CProduct* GetProduct()
{
TRACE("GetProduct");
if (0 == m_pProduct)
{
m_pProduct = CreateProduct();
}
return m_pProduct;
}
};
// 工厂方法具体类,创建CConcreteProduct类型的产品。一种具体产品类需要一个工厂方法具体类
class CConcreteCreator : public CCreator
{
public:
CConcreteCreator()
{
TRACE("CConcreteCreator");
}
virtual ~CConcreteCreator()
{
TRACE("~CConcreteCreator");
}
// FactoryMethod
virtual CProduct* CreateProduct()
{
TRACE("CreateProduct");
return new CConcreteProduct();
}
};
int main()
{
CCreator* pCreator = new CConcreteCreator();
if (!pCreator)
{
TRACE("error 1");
return 1;
}
CProduct* pProduct = pCreator->GetProduct();
if (!pProduct)
{
TRACE("error 2");
return 2;
}
pProduct->Operation();
delete pCreator;
pCreator = 0;
return 0;
}
/*
@ubuntu :/home/hgc/test" rel="nofollow">root@ubuntu :/home/hgc/test# g++ factory_method.cpp -o factory_method -g -Wall
@ubuntu :/home/hgc/test" rel="nofollow">root@ubuntu :/home/hgc/test# ./factory_method
CCreator
CConcreteCreator
GetProduct
CreateProduct
CProduct
CConcreteProduct
Operation
~CConcreteCreator
~CCreator
~CConcreteProduct
~CProduct
@ubuntu :/home/hgc/test" rel="nofollow">root@ubuntu:/home/hgc/test#
*/
// factory_method_template.cpp
#include <stdio.h>
#ifdef _X_RELEASE_
#define TRACE(str)
#else
#define TRACE(str) printf("%s/n", str)
#endif
// 产品抽象类,定义接口
class CProduct
{
public:
CProduct()
{
TRACE("CProduct");
}
virtual ~CProduct()
{
TRACE("~CProduct");
}
virtual void Operation() = 0;
};
// 具体产品类
class CConcreteProduct : public CProduct
{
public:
CConcreteProduct()
{
TRACE("CConcreteProduct");
}
virtual ~CConcreteProduct()
{
TRACE("~CConcreteProduct");
}
virtual void Operation()
{
TRACE("Operation");
}
};
// 工厂方法抽象类
class CCreator
{
public:
CCreator()
{
TRACE("CCreator");
}
virtual ~CCreator()
{
TRACE("~CCreator");
}
// FactoryMethod
virtual CProduct* CreateProduct() = 0;
};
// 工厂方法类模板,构造CProduct的子类(TProduct)类型的产品
template <typename TProduct>
class CStandardCreator : public CCreator
{
public:
CStandardCreator()
{
TRACE("CStandardCreator");
}
virtual ~CStandardCreator()
{
TRACE("~CStandardCreator");
}
// FactoryMethod
virtual CProduct* CreateProduct();
};
template <typename TProduct>
CProduct* CStandardCreator<TProduct>::CreateProduct()
{
return new TProduct();
}
int main()
{
CStandardCreator<CConcreteProduct> concreteCreator;
CProduct* pProduct = concreteCreator.CreateProduct();
if (!pProduct)
{
TRACE("error 1");
return 1;
}
pProduct->Operation();
delete pProduct;
pProduct = 0;
return 0;
}
/*
root@ubuntu:/home/hgc/test# g++ factory_method_template.cpp -o factory_method_template -g -Wall
root@ubuntu:/home/hgc/test# ./factory_method_template
CCreator
CStandardCreator
CProduct
CConcreteProduct
Operation
~CConcreteProduct
~CProduct
~CStandardCreator
~CCreator
root@ubuntu:/home/hgc/test#
*/