设计模式(四)std::function接口编程彻底取代抽象工厂和工厂方法
来源:互联网 发布:秦淮数据怎么样 编辑:程序博客网 时间:2024/06/05 20:53
抽象工厂Abstract Factory
意图:用工厂类的不同成员函数来返回不同类型的对象。这些不同的对象往往是有着共同的基类,最终是想利用多态。而多态已经被function+bind取代,所以这个模式没啥意义!特点:使用智能指针获取对象,而不是暴露原始指针。
代码:
#include "boost/smart_ptr.hpp"#include "boost/weak_ptr.hpp"#include<iostream>using namespace std;using namespace boost;//接口类class Base{public://抽象基类virtual void f(void) = 0;//接口函数virtual void g(void) = 0;//接口函数protected://只有派生类才可以创建基类对象Base(){cout<<"Base()"<<endl;}~Base(){cout<<"~Base()"<<endl;}};class A : public Base{public:A(void){cout<<"A()"<<endl;}~A(void){cout<<"~A()"<<endl;}void f(void) {cout<<"A::f()"<<endl;}void g(void) {cout<<"A::g()"<<endl;}};class B : public Base{public:B(void){cout<<"B()"<<endl;}~B(void){cout<<"~B()"<<endl;}void f(void) {cout<<"B::f()"<<endl;}void g(void) {cout<<"B::g()"<<endl;}};//各种对象创建的统一入口,而不是全局的多个公开函数class Factory{public:static boost::shared_ptr<Base> CreateA(void){return boost::make_shared<A>();};static boost::shared_ptr<Base> CreateB(void){return boost::make_shared<B>();}; };int main(int,char**){boost::shared_ptr<Base> pbase = Factory::CreateA();pbase->f();pbase->g();//引用计数为0自动释放对象pbase = Factory::CreateB();pbase->f();pbase->g();return 0;};
工厂方法Factory Method
意图:定义一个创建对象的接口,让子类决定实例化哪一个类,意图同抽象工厂一样想使用多态,所以这个模式也是多余的,使用function+bind即可。这个模式就是想突破抽象工厂修改源代码的问题。使用C++模板就可以轻松实现。
代码:
#include "boost/smart_ptr.hpp"#include "boost/weak_ptr.hpp"#include<iostream>using namespace std;using namespace boost;//接口类class Base{public://抽象基类virtual void f(void) = 0;//接口函数virtual void g(void) = 0;//接口函数protected://只有派生类才可以创建基类对象Base(){cout<<"Base()"<<endl;}~Base(){cout<<"~Base()"<<endl;}};class A : public Base{public:A(void){cout<<"A()"<<endl;}~A(void){cout<<"~A()"<<endl;}void f(void) {cout<<"A::f()"<<endl;}void g(void) {cout<<"A::g()"<<endl;}};class B : public Base{public:B(void){cout<<"B()"<<endl;}~B(void){cout<<"~B()"<<endl;}void f(void) {cout<<"B::f()"<<endl;}void g(void) {cout<<"B::g()"<<endl;}};//添加新类不需要修改原来的代码template<typename T>class Factory{public:static boost::shared_ptr<T> Creator(void){return boost::make_shared<T>();};};int main(int,char**){boost::shared_ptr<Base> pbase = Factory<A>::Creator();pbase->f();pbase->g();//引用计数为0自动释放对象pbase = Factory<B>::Creator();pbase->f();pbase->g();return 0;};
面向接口编程
上面的程序无非是想调用不同的void fun(void)函数,那么更一般的,抽象接口类应该是一些函数的集合。函数可以随意指定,拼装。
使用function+bind应该像下面这样:
代码:
#include <functional>#include <memory>#include<iostream>using namespace std;#include "boost/noncopyable.hpp"class A {public:A(void){cout<<"A()"<<endl;}~A(void){cout<<"~A()"<<endl;}void f(void) {cout<<"A::f()"<<endl;}void g(void) {cout<<"A::g()"<<endl;}};class B {public:B(void){cout<<"B()"<<endl;}~B(void){cout<<"~B()"<<endl;}void f(void) {cout<<"B::f()"<<endl;}void g(void) {cout<<"B::g()"<<endl;}};class InterfaceBase : public boost::noncopyable{typedef function<void(void)> f_callback;typedef function<void(void)> g_callback;public:InterfaceBase(f_callback f1,g_callback g1):f(f1),g(g1){}public:f_callback f;g_callback g;};int main(int,char**){A a;InterfaceBase ibase(bind(&A::f,&a),bind(&A::g,&a));ibase.f();ibase.g();B b;//注意这里没有多态,没有指针,没有虚函数,没有二进制兼容问题InterfaceBase ibase1(bind(&B::f,&b),bind(&B::g,&b));ibase1.f();ibase1.g();return 0;};
0 0
- 设计模式(四)std::function接口编程彻底取代抽象工厂和工厂方法
- 【设计模式之四:工厂模式对比】简单工厂、工厂方法和抽象工厂的区别
- 设计模式:工厂方法和抽象工厂
- 简单工厂、工厂方法和抽象工厂设计模式
- 设计模式--简单工厂、工厂方法和抽象工厂
- 设计模式: 简单工厂, 工厂方法, 和抽象工厂总结
- 设计模式之简单工厂、工厂方法和抽象工厂
- 设计模式之简单工厂、工厂方法和抽象工厂
- 【设计模式】简单工厂、工厂方法和抽象工厂
- 设计模式--工厂模式(工厂方法、抽象工厂)
- 设计模式 - 工厂模式(简单,工厂方法,抽象工厂)
- 设计模式系列(七)简单工厂模式、工厂方法模式和抽象工厂模式对比
- 常用Java设计模式系列(5)- 简单工厂、工厂方法模式和抽象工厂模式
- 设计模式(四)-工厂模式-抽象工厂模式
- 设计模式之四:工厂模式(简单工厂、工厂方法、抽象工厂)
- Java设计模式-工厂方法模式和抽象工厂模式
- Android设计模式---工厂方法模式和抽象工厂模式
- 设计模式之工厂方法模式和抽象工厂模式
- SpringMVC+mybatis +oracle wm_concat 报错 ORA-22922: 不存在的 LOB
- 内存管理技巧和方式
- 谷歌浏览器详细用法
- ThinkPHP-微信支付案例
- HDOJ:最少拦截系统
- 设计模式(四)std::function接口编程彻底取代抽象工厂和工厂方法
- 混IT,必须理解“甲方乙方”
- 正确使用Android性能分析工具——TraceView
- Multiple types were found that match the controller
- C# Timer用法及实例详解
- object 定位 全屏 在浏览器中的问题
- JNDI数据源的配置
- SQLiteLog : (1) no such column: playTime
- 关于Android中图片大小、内存占用与drawable文件夹关系的研究与分析