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

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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: