Be MySelf                                                    
 

 

日志更新

最新评论

留言板

链接

Blog信息





Abstract Factory 模式C++实现
haosheng 发表于 2006/8/10 13:16:00

Design Pattern(C++)——Abstract Factory

Abstract Factory

 

Introduction

我使用实例来说明各个设计模式,因为理论已经讲得太多了,现在我来体现理论对实践的指导作用。在我设计一个插件结构的时候,我需要考虑可移植的问题。在不同的平台中管理插件的控制类具有相同的接口,但具有不同的具体行为,比如有for Win32PluginManager,有for LinuxPluginManager,等等。这些PluginManager都遵循相同的接口,但有各自的实现。为了对使用者屏蔽这些内部的细节,不和具体的某个PluginManager耦合起来,我使用了一个工厂来负责创建它们的实例。类似的,工厂还创建其它的对象,如PluginRegistry。我可以在工厂中创建某个具体的PluginManager,某个工厂创建某个具体的PluginManager,而这些工厂具有相同的接口ObjectFactory。另外,我对ObjectFactory使用了单例模式。这里的单例模式没有使用静态成员,而只是在函数内部使用了一个局部静态变量,这是利用了C++的特性。

Class & Description

Class

Description

ObjectFactory

一个抽象工厂,负责创建PluginManager等对象,同时使用了单例模式getInstance函数默认返回Win32ObjectFactory对象

PluginManager

一种产品,这里是插件管理类的接口

Win32ObjectFactory

派生自PluginManager Win32平台下ObjectFactory的实现,否则创建对应的PluginManager对象

Win32PluginManager

派生自PluginManager Win32平台下PluginManager的实现

PluginRegistry

一种产品

……

 

 

C++ Implementation

Environment

Windows XP ProfessionalVisual C++2005

ObjectFactory

默认是创建Win32PluginManager,在实际开发中先判断平台类型,然后创建相应的PluginManager对象。

//ObjectFactory.h

#pragma once

 

class PluginManager;

class PluginRegistry;

class PluginLifecycleHandler;

class ObjectFactory

{

protected:

       ObjectFactory(void);

public:

       virtual ~ObjectFactory(void);

       virtual PluginManager* createPluginManager() = 0;

       virtual PluginRegistry* createPluginRegistry()=0;

       virtual PluginLifecycleHandler* createPluginLifecycleHandler()=0;

public:

       static ObjectFactory* getInstance();

};

 

// ObjectFactory.cpp

#i nclude "StdAfx.h"

#i nclude "PluginManager.h"

#i nclude "PluginRegistry.h"

#i nclude "PluginLifecycleHandler.h"

#i nclude "ObjectFactory.h"

#i nclude "Win32ObjectFactory.h"

 

ObjectFactory::ObjectFactory(void)

{

}

 

ObjectFactory::~ObjectFactory(void)

{

}

ObjectFactory* ObjectFactory::getInstance()

{

       static ObjectFactory* instance = NULL;

       if ( instance == NULL )

       {

              instance = new Win32ObjectFactory();

       }

       return instance;

}

PluginManager

//PluginManager.h

#pragma once

 

class PluginManager

{

public:

       PluginManager(void);

public:

       ~PluginManager(void);

};

 

//PluginManager.cpp

#i nclude "PluginManager.h"

 

PluginManager::PluginManager(void)

{

}

 

PluginManager::~PluginManager(void)

{

}

Win32ObjectFactory

//Win32ObjectFactory.h

#pragma once

 

class ObjectFactory;

class PluginManager;

class PluginRegistry;

class PluginLifecycleHandler;

 

class Win32ObjectFactory: public ObjectFactory

{

public:

       Win32ObjectFactory(void);

public:

       ~Win32ObjectFactory(void);

public:

       PluginManager* createPluginManager();

       PluginRegistry* createPluginRegistry();

       PluginLifecycleHandler* createPluginLifecycleHandler();

};

 

//Win32ObjectFactory.cpp

#i nclude "StdAfx.h"

#i nclude "ObjectFactory.h"


阅读全文 | 回复(0) | 引用通告 | 编辑 | 收藏该日志
 


发表评论:

    昵称:
    密码:
    主页:
    标题: