设计模式(四)std::function接口编程彻底取代抽象工厂和工厂方法
2016-03-16 11:44
701 查看
抽象工厂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; };
相关文章推荐
- Python 常用的特殊函数
- Java NIO系列教程(七) FileChannel
- 【转】PHP实现连贯操作
- JAVA 中BIO,NIO,AIO的理解
- 实例讲解C++设计模式编程中State状态模式的运用场景
- 正则表达式如何在PHP里灵活的应用
- C# Timer用法及实例详解
- python 模式集锦
- C# 关于datetime的用法(网上考的)
- 转换到COFF期间失败:文件无效或损坏
- ThinkPHP-微信支付案例
- php分享三十四:待排查问题
- PHP匿名函数和use子句用法实例
- Spring整合activiti-modeler5.16遇到的小问题
- MyBatis与Spring设置callSettersOnNulls
- Spring整合activiti-modeler5.16遇到的小问题
- Java运算符优先级
- Weblogic操作数据源NameNotFoundException解决办法
- smarty缓存原理讲解(php缓存篇)
- eclipse安装jrebel控件及破解方法,maven项目的热部署