1.模式功能
- 定义创建对象的接口,封装了对象的创建
- 使得具体化类的工作延迟到了子类中
2.为什么使用Factory 模式
1.为了提高内聚和松耦合,我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。这样我们可以通过声明一个指向基类的指针来指向实际的子类实现,达到了多态的目的。
2.Factory 模式不单是提供了创建对象的接口,其最重要的是延迟了子类的实例化
“product.h”
#ifndef _PRODUCT_H
#define _PRODUCT_H
class Product{
public:
virtual ~Product() = 0;
protected:
Product();
};
class ConcreteProduct:public Product{
public:
ConcreteProduct();
~ConcreteProduct();
};
#endif
“product.cpp”
#include<iostream>
#include"product.h"
using namespace std;
Product::Product(){}
Product::~Product(){}
ConcreteProduct::ConcreteProduct(){
cout << "ConcreteProduct" << endl;
}
ConcreteProduct::~ConcreteProduct(){
}
“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.cpp”
#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();
}
“test.cpp”
#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 是一类,有一个共同的基类)。