设计模式——工厂模式
2017-07-23 19:48
197 查看
*除了单例模式和观察者监听者模式,本篇再介绍一下工厂模式。。。→_→*
面向对象编程中出现的问题
在面向对象编程中,可能会会由一种父类派生出许许多多的子类。而当我们在使用new实例化一个子类对象之前,也可能需要进行很多提前操作,比如调用其他的方法、获取相应的参数列表的值、在数据库中查询相关信息等
当类型越来越多、名字越来越复杂的时候,每次去实例化一个子类对象时,都要进行很多提前操作,这就导致了出现了大量的可能产生问题的代码。使得可维护性下降,发生错误的时候查询错误、更正错误就会变得非常困难
工厂模式的作用
工厂模式的应用实现了代码的高内聚低耦合,其中定义了创建子类对象的接口,封装了子类对象的创建过程,这样我们就不用每次都辛苦的写一堆实例化子类对象的提前操作
工厂模式的应用也使实例化子类对象的操作延迟到了子类中,因为只有在子类中可以决定到底实例化哪一个类
工厂模式结构示意图
![](https://img-blog.csdn.net/20170723190322764?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva29uZ2tvbmdra2s=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
代码实现
运行结果
![](https://img-blog.csdn.net/20170723194446390?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva29uZ2tvbmdra2s=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
*码完。。。收工。。。→_→*
面向对象编程中出现的问题
在面向对象编程中,可能会会由一种父类派生出许许多多的子类。而当我们在使用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; }
运行结果
*码完。。。收工。。。→_→*
相关文章推荐
- 设计模式之一----工厂模式
- 《Head First 设计模式》阅读笔记(四)——工厂模式
- Java-设计模式-工厂模式浅谈(二)-工厂方法模式
- 设计模式探索——工厂模式
- 设计模式(四)——工厂模式
- GOF23设计模式之 工厂模式
- java设计模式—工厂模式
- java设计模式 工厂模式
- 设计模式---工厂模式Factory(创建型)
- java设计模式之——工厂模式
- 设计模式 篇 单子模式 门面模式 适配器 工厂模式 观察者模式 命令者模式 装饰者模式 代理模式 简单讲解
- 设计模式____工厂模式(简单工厂,抽象工厂)
- C#设计模式学习小结之一 工厂模式
- 设计模式-工厂模式
- java设计模式——工厂模式
- 设计模式和工厂模式的结合
- C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)
- 【设计模式】工厂模式是创建型模式 策略模式是行为性模式
- 设计模式——工厂模式
- 基本设计模式:单例模式和工厂模式代码实现