这几天优快云更新的文章经常莫名其妙失踪先更新到这里。
刚才看了一个书的介绍里面提到设计模式才想起来的这些,感觉比较有意思,不久的将来可能也用得上,防止遗忘记录下来。
2010年初自己做过一个2D全45度角的RPG游戏demo,主要还是为了实践一下书上的一些东西,忘了是《C++游戏编程》还是《C++沉思录》里面看到的对象工厂模式,刚才费劲想了一下才回忆起这个模式的目标:对用户(使用类库的程序员)屏蔽实现细节,只暴露基类的抽象接口。这个概念学过面向对象编程语言都能理解,那么在程序中让用户使用定义好的抽象接口不就得了,何必搞出一个对象工厂?
对象工厂在屏蔽技术细节或者说出于各种原因隐藏实现细节上做得更加彻底,使用对象工厂用户接触不到任何子类的代码,包括头文件也对用户隐藏,只能看到基类.h文件的几个抽象接口。
好长时间不使用C++语法十分生疏,我就用伪代码和C++代码混合来描述吧
代表目标生成对象的基类 A,子类B,C
class A
{
public void do(){};
刚才看了一个书的介绍里面提到设计模式才想起来的这些,感觉比较有意思,不久的将来可能也用得上,防止遗忘记录下来。
2010年初自己做过一个2D全45度角的RPG游戏demo,主要还是为了实践一下书上的一些东西,忘了是《C++游戏编程》还是《C++沉思录》里面看到的对象工厂模式,刚才费劲想了一下才回忆起这个模式的目标:对用户(使用类库的程序员)屏蔽实现细节,只暴露基类的抽象接口。这个概念学过面向对象编程语言都能理解,那么在程序中让用户使用定义好的抽象接口不就得了,何必搞出一个对象工厂?
对象工厂在屏蔽技术细节或者说出于各种原因隐藏实现细节上做得更加彻底,使用对象工厂用户接触不到任何子类的代码,包括头文件也对用户隐藏,只能看到基类.h文件的几个抽象接口。
好长时间不使用C++语法十分生疏,我就用伪代码和C++代码混合来描述吧
代表目标生成对象的基类 A,子类B,C
class A
{
public void do(){};
};
class B public:A
{
public void do(){};
};
class C public:A
{
public void do(){};
class B public:A
{
public void do(){};
};
class C public:A
{
public void do(){};
};
对象工厂类
class CFactory
{
public A* getobject( string objectname );//返回一个基类A的指针或者引用,这里用指针
对象工厂类
class CFactory
{
public A* getobject( string objectname );//返回一个基类A的指针或者引用,这里用指针
};
以上对象定义都在.h文件中,任何实现都在.cpp文件。
CFactory的getobject方法根据objectname参数返回一个用户要求生成的A类型实际指向子类B或C对象的指针,这个函数的实现可以很简单也可以很复杂,主要取决于类树的复杂程度以及代码实现的功能,简单的做法就是定义一个switch路由各个子类名返回相应指针,复杂的可以使用一些数据结构,例如表等等。
用户需要得到一个B或者C类对象只需要类似这样调用:
include"CFactory.h"//只需要包含这个头文件
CFactory cFactory;
A* b = cFactory.getobject( “B” );
或者
A* c = cFactory.getobject( “C" );
因为CFactory定义时只用到了基类的指针类型和一些基类的函数,所以只需要在CFactory类的头文件中包含基类A的头文件。CFactory的getobject函数实现在.cpp文件中,也就是说整个项目中只有这里才需要用到各个需生成子类的信息,所以各个需生成的子类的.h文件只需要包含到这个cpp里面即可,包含语句不需要出现在其他任何文件中。由于编译成库后用户是看不到代码的,所以实现了绝对子类对用户的透明度。
总结对象工厂实现屏蔽目标依赖的C++语言特性:抽象,继承,定义与实现文件分离,编译执行 。
以上对象定义都在.h文件中,任何实现都在.cpp文件。
CFactory的getobject方法根据objectname参数返回一个用户要求生成的A类型实际指向子类B或C对象的指针,这个函数的实现可以很简单也可以很复杂,主要取决于类树的复杂程度以及代码实现的功能,简单的做法就是定义一个switch路由各个子类名返回相应指针,复杂的可以使用一些数据结构,例如表等等。
用户需要得到一个B或者C类对象只需要类似这样调用:
include"CFactory.h"//只需要包含这个头文件
CFactory cFactory;
A* b = cFactory.getobject( “B” );
或者
A* c = cFactory.getobject( “C" );
因为CFactory定义时只用到了基类的指针类型和一些基类的函数,所以只需要在CFactory类的头文件中包含基类A的头文件。CFactory的getobject函数实现在.cpp文件中,也就是说整个项目中只有这里才需要用到各个需生成子类的信息,所以各个需生成的子类的.h文件只需要包含到这个cpp里面即可,包含语句不需要出现在其他任何文件中。由于编译成库后用户是看不到代码的,所以实现了绝对子类对用户的透明度。
总结对象工厂实现屏蔽目标依赖的C++语言特性:抽象,继承,定义与实现文件分离,编译执行 。