1.为了提高内聚和松耦合,我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。这样我们可以通过声明一个指向基类的指针来指向实际的子类实现,达到了多态的目的。
图1 factory模式结构示意图
2.Factory 模式不单是提供了创建对象的接口,其最重要的是延迟了子类的实例化
图2 factory模式结构示意图 图 2 中关键中 Factory 模式的应用并不是只是为了封装对象的创建,而是要把对象的创建放到子类中实现:Factory 中只是提供了对象创建的接口,其实现将放在 Factory 的子类ConcreteFactory 中进行。 ## 代码实现
#ifndef _PRODUCT_H
#define _PRODUCT_H
class Product{
public:
virtual ~Product() = 0;
protected:
Product();
};
class ConcreteProduct:public Product{
public:
ConcreteProduct();
~ConcreteProduct();
};
#endif
#include<iostream>
#include"product.h"
using namespace std;
Product::Product(){}
Product::~Product(){}
ConcreteProduct::ConcreteProduct(){
cout << "ConcreteProduct" << endl;
}
ConcreteProduct::~ConcreteProduct(){
}
#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
#include<iostream>
#include"factory.h"
#include"product.h"
using namespace std;
Factory::Factory(){}
Factory::~Factory(){}
ConcreteFactory::ConcreteFactory()
{
cout << "ConcreteFactory....." << endl;
}
ConcreteFactory::~ConcreteFactory()
{
}
Product* ConcreteFactory::CreateProduct()
{
return new ConcreteProduct();
}
#include"factory.h"
#include"product.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
Factory* fac = new ConcreteFactory();//基类
Product* p = fac->CreateProduct();//派生类方法调用
system("pause");
return 0;
}
Factory 提供的创建对象的接口封装(第一个功能),以及其将类的实例化推迟到子类(第二个功能) 都部分地解决了实际问题,对于对象的创建给予开发人员提供了很好的实现策略,但是Factory 模式仅仅局限于一类类(就是说 Product 是一类,有一个共同的基类)。