设计模式(四)std::function接口编程彻底取代抽象工厂和工厂方法

 

抽象工厂Abstract Factory

意图:用工厂类的不同成员函数来返回不同类型的对象。这些不同的对象往往是有着共同的基类,最终是想利用多态。而多态已经被function+bind取代,所以这个模式没啥意义!

 

特点:使用智能指针获取对象,而不是暴露原始指针。

代码:

 

#include "boost/smart_ptr.hpp"
#include "boost/weak_ptr.hpp"

#include
using namespace std;
using namespace boost;
//接口类
class Base
{
public:
	//抽象基类
	virtual void f(void) = 0;//接口函数
	virtual void g(void) = 0;//接口函数
protected:
	//只有派生类才可以创建基类对象
	Base(){cout<<"Base()"< CreateA(void)
	{
		return boost::make_shared();
	};
	static boost::shared_ptr CreateB(void)
	{
		return boost::make_shared();
	}; 
};

int main(int,char**)
{

	boost::shared_ptr pbase = Factory::CreateA();
	pbase->f();
	pbase->g();
	//引用计数为0自动释放对象
	pbase = Factory::CreateB();
	pbase->f();
	pbase->g();

	return 0;
};

 

设计模式(四)std::function接口编程彻底取代抽象工厂和工厂方法_第1张图片

 

 

工厂方法Factory Method

意图:定义一个创建对象的接口,让子类决定实例化哪一个类,意图同抽象工厂一样想使用多态,所以这个模式也是多余的,使用function+bind即可。
这个模式就是想突破抽象工厂修改源代码的问题。使用C++模板就可以轻松实现。

 

代码:

 

#include "boost/smart_ptr.hpp"
#include "boost/weak_ptr.hpp"

#include
using namespace std;
using namespace boost;
//接口类
class Base
{
public:
	//抽象基类
	virtual void f(void) = 0;//接口函数
	virtual void g(void) = 0;//接口函数
protected:
	//只有派生类才可以创建基类对象
	Base(){cout<<"Base()"<
class Factory
{
public:
	static boost::shared_ptr Creator(void)
	{
		return boost::make_shared();
	};
};

int main(int,char**)
{

	boost::shared_ptr pbase = Factory::Creator();
	pbase->f();
	pbase->g();
	//引用计数为0自动释放对象
	pbase = Factory::Creator();
	pbase->f();
	pbase->g();

	return 0;
};

设计模式(四)std::function接口编程彻底取代抽象工厂和工厂方法_第2张图片

 

 

 

面向接口编程

object-based

上面的程序无非是想调用不同的void fun(void)函数,那么更一般的,抽象接口类应该是一些函数的集合。函数可以随意指定,拼装。

 

使用function+bind应该像下面这样:

代码:

 

#include 
#include 
#include
using namespace std;
#include "boost/noncopyable.hpp"

class A 
{
public:
	A(void){cout<<"A()"< f_callback;
	typedef function 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;
};


设计模式(四)std::function接口编程彻底取代抽象工厂和工厂方法_第3张图片

 

 

 

 

 

 

你可能感兴趣的:(C++,设计模式,C++,11)