设计模式(四)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