C++设计模式之工厂模式

2020-01-06 15:21:07王冬梅

图 1 所以的工厂模式经常在系统开发中用到,但是这并不是工厂模式的最大威力所在(因为这可以通过其他方式解决这个问题)。工厂模式不单是提供了创建对象的接口,其最重要的是延迟了子类的实例化(第二个问题),以下是这种情况的一个工厂的结构示意图:

C++,设计模式,工厂模式

图 2 中关键中工厂模式的应用并不是只是为了封装对象的创建,而是要把对象的创建放到子类中实现:工厂中只是提供了对象创建的接口,其实现将放在工厂的子类Concrete工厂中进行。这是图 2 和图 1 的区别所在。

工厂模式的实现

完整代码示例(code):工厂模式的实现比较简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用 C++实现,并在 VC 6.0 下测试运行)。

代码片断 1:Product.h


//Product.h
#ifndef _PRODUCT_H_
#define _PRODUCT_H_
class Product{
 public:
 virtual ~Product() =0;
 protected:
 Product(); //屏蔽构造函数
 private:
};
class ConcreteProduct:publicProduct{
 public:
 ~ConcreteProduct();
 ConcreteProduct();
 protected:
 private:
};
#endif //~_PRODUCT_H_

代码片断 2:Product.cpp


//Product.cpp
#include "Product.h"
#include<iostream>
using namespace std;
Product::Product(){
}
Product::~Product(){
}
ConcreteProduct::ConcreteProduct(){
 cout<<"ConcreteProduct...."<<endl;
}
ConcreteProduct::~ConcreteProduct(){
}

代码片断 3:Factory.h


//Factory.h
#ifndef _FACTORY_H_
#define _FACTORY_H_
class Product;
class Factory{
 public:
 virtual ~Factory() = 0;
 virtual Product* CreateProduct() = 0;
 protected:
 Factory();
 private:
};
class ConcreteFactory:public Factory{
 public:
 ~ConcreteFactory();
 ConcreteFactory();
 Product* CreateProduct();
 protected:
 private:
};
#endif //~_FACTORY_H_

代码片断 4:Factory.cpp


//Factory.cpp
#include "Factory.h"
#include "Product.h"
#include <iostream>
using namespace std;
Factory::Factory(){
}
Factory::~Factory(){
}
ConcreteFactory::ConcreteFactory(){
 cout<<"ConcreteFactory....."<<endl;
}
ConcreteFactory::~ConcreteFactory(){
}
Product* ConcreteFactory::CreateProduct(){
 return new ConcreteProduct();
}