工厂方法模式 是一种面向对象的设计模式。通过调用不同的方法返回需要的类,而不是去实例化具体的类。 对实例创建进行了包装。 工厂方法是一组方法, 他们针对不同条件返回不同的类实例,这些类一般有共同的父类。
工厂方法模式实施一种按需分配的策略, 即传入参数进行选择, 工厂方法根据参数进行选择,返回具体的实例。
// Product.h
#ifndef _PRODUCT_H_
#define _PRODUCT_H_
class Product
{
protected:
Product();
public:
virtual ~Product() = 0;
};
// 这里可以有多个Product子类
class ConcreteProduct : public Product
{
public:
~ConcreteProduct();
ConcreteProduct();
};
#endif // _PRODUCT_H_
// Product.cpp
#include <iostream>
using namespace std;
#include "Product.h"
Product::Product()
{
cout << "Product::Product" << endl;
}
Product::~Product()
{
cout << "Product::~Product" << endl;
}
///////////////////////////////////////////
ConcreteProduct::ConcreteProduct()
{
cout << "ConcreteProduct::ConcreteProduct" << endl;
}
ConcreteProduct::~ConcreteProduct()
{
cout << "ConcreteProduct::~ConcreteProduct" << endl;
}
// Factory.h
#ifndef _FACTORY_H_
#define _FACTORY_H_
class Product;
class Factory
{
protected:
Factory();
public:
virtual ~Factory() = 0;
virtual Product* CreateProduct() = 0;
};
class ConcreteFactory : public Factory
{
public:
ConcreteFactory();
~ConcreteFactory();
Product* CreateProduct();
};
#endif // _FACTORY_H_
// Factory.cpp
#include <iostream>
using namespace std;
#include "Factory.h"
#include "Product.h"
Factory::Factory()
{
cout << "Factory::Factory" << endl;
}
Factory::~Factory()
{
cout << "Factory::~Factory" << endl;
}
/////////////////////////////////////////////////
ConcreteFactory::ConcreteFactory()
{
cout << "ConcreteFactory::ConcreteFactory" << endl;
}
ConcreteFactory::~ConcreteFactory()
{
cout << "ConcreteFactory::~ConcreteFactory" << endl;
}
// 可以通过传不同的参数来创建不同的产品
Product* ConcreteFactory::CreateProduct()
{
return new ConcreteProduct();
}
// main.cpp
#include <iostream>
using namespace std;
#include "Factory.h"
#include "Product.h"
#define IF_EXIST_DELETE(OBJECT) \
{ \
if (OBJECT) \
{ \
delete OBJECT; \
OBJECT = NULL; \
} \
}
int main(int argc, char *argv[])
{
Factory *factory = new ConcreteFactory();
Product *product = factory->CreateProduct();
IF_EXIST_DELETE(product);
IF_EXIST_DELETE(factory);
system("pause");
return 0;
}
虚析构函数的作用: 当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。 虚函数与纯虚函数:定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。定义一个函数为纯虚函数,才代表函数没有被实现。定义他是为了实现一个接口,起到一个规范的作用,规范继承这个类的.程序员必须实现这个函数。
2011-07-14