您的位置:首页 > 编程语言

设计模式——工厂模式

2017-07-23 19:48 197 查看
*除了单例模式和观察者监听者模式,本篇再介绍一下工厂模式。。。→_→*

面向对象编程中出现的问题

在面向对象编程中,可能会会由一种父类派生出许许多多的子类。而当我们在使用new实例化一个子类对象之前,也可能需要进行很多提前操作,比如调用其他的方法、获取相应的参数列表的值、在数据库中查询相关信息等

当类型越来越多、名字越来越复杂的时候,每次去实例化一个子类对象时,都要进行很多提前操作,这就导致了出现了大量的可能产生问题的代码。使得可维护性下降,发生错误的时候查询错误、更正错误就会变得非常困难

工厂模式的作用

工厂模式的应用实现了代码的高内聚低耦合,其中定义了创建子类对象的接口,封装了子类对象的创建过程,这样我们就不用每次都辛苦的写一堆实例化子类对象的提前操作

工厂模式的应用也使实例化子类对象的操作延迟到了子类中,因为只有在子类中可以决定到底实例化哪一个类

工厂模式结构示意图



代码实现

#include <iostream>
#include <vld.h>
using namespace std;

//产品父类
class Product
{
public:
virtual ~Product() = 0;
protected:
Product() {};
};
Product::~Product() {}

//产品子类A
class ConcreteProductA : public Product
{
public:
~ConcreteProductA() {}
ConcreteProductA()
{
cout << "ConcreteProductA..." << endl;
}
};

//产品子类B
class ConcreteProductB : public Product
{
public:
~ConcreteProductB() {}
ConcreteProductB()
{
cout << "ConcreteProductB..." << endl;
}
};

//产品子类C
class ConcreteProductC : public Product
{
public:
~ConcreteProductC() {}
ConcreteProductC()
{
cout << "ConcreteProductC..." << endl;
}
};

//工厂父类
class Factory
{
public:
virtual ~Factory() = 0;
//工厂父类中提供实例化不同产品子类的调用接口,即纯虚函数
//在工厂子类中重写调用接口,多个调用接口的重载以实现实例化不同的产品子类
//这样就将实例化产品子类对象的操作延迟到了工厂子类中
virtual Product* CreateProduct(int num) = 0;
protected:
Factory() {}
};
Factory::~Factory() {}

//工厂子类
class ConcreteFactory : public Factory
{
public:
~ConcreteFactory() {}
ConcreteFactory()
{
cout << "ConcreteFactory..." << endl;
}
//工厂子类中提供了实例化产品子类的调用接口
//很好地将提前操作封装起来,实现代码的高内聚低耦合,提高了代码的可维护性和可扩展性
//可以通过参数switch不同的产品子类的实例化调用接口
Product* CreateProduct(int num)
{
switch (num)
{
case 0:
return new ConcreteProductA();
break;
case 1:
return new ConcreteProductB();
break;
case 2:
return new ConcreteProductC();
break;
default:
break;
}
}
};

int main()
{
Factory* fac = new ConcreteFactory();//创建工厂子类
//利用工厂子类提供的调用接口实例化某一种产品对象
Product* pA = fac->CreateProduct(0);
Product* pB = fac->CreateProduct(1);
Product* pC = fac->CreateProduct(2);

delete pA;
delete pB;
delete pC;
delete fac;
return 0;
}


运行结果



*码完。。。收工。。。→_→*
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息