Symbian常用设计模式之可伸缩对象工厂
来源:互联网 发布:gif图查看软件 编辑:程序博客网 时间:2024/05/17 12:20
1.对象型别依存性
2.执行期识别--虚构造函数
3.可伸缩工厂
4.Symbian中实现可伸缩的对象工厂
Symbian中不能用std::map这个数据类型,所以需要自己实现map表。
我写了一个类TMapModel,里面有两个成员变量,一个TUid,一个指向函数的指针,从而完成一对映射。
在Factory类中,用RArray<TMapModel>,将所有映射关系组合起来,作为Map表。
具体实现如下
(1) mapmodel.h //映射关系头文件
#ifndef T_MAPMODEL_H
#define T_MAPMODEL_H
#include <e32base.h>
class CAknView;
class TMapModel
{
public:
typedef CAknView* (*CreateViewCallback)();
TMapModel( TUid aViewId, CreateViewCallback aCreateCallback );
inline TUid ViewId()
{
return iViewId;
};
inline CreateViewCallback CreateCallback()
{
return iCreateCallback;
};
private:
TUid iViewId;
CreateViewCallback iCreateCallback;
};
#endif
(2) mapmodel.cpp
#include "mapmodel.h"
TMapModel::TMapModel( TUid aViewId, CreateViewCallback aCreateCallback )
:iViewId( aViewId ), iCreateCallback( aCreateCallback )
{
}
(3) viewfactory.h // 工厂类头文件
#ifndef C_VIEWFACTORY_H
#define C_VIEWFACTORY_H
#include <e32base.h>
#include "mapmodel.h"
class CViewFactory : public CBase
{
public:
static CViewFactory* NewL();
static CViewFactory* NewLC();
~CViewFactory();
TInt RegistViewL( TUid aViewId, TMapModel::CreateViewCallback aCreateCallback );
CAknView* CreateViewL( TUid aViewId );
private:
void ConstructL();
private:
RArray<TMapModel> iMap;
};
#endif //C_VIEWFACTORY_H
(4) viewfactory.cpp //工厂类的实现
#include <aknview.h>
#include "mapmodel.h"
#include "viewfactory.h"
CViewFactory* CViewFactory::NewL()
{
CViewFactory* self = CViewFactory::NewLC();
CleanupStack::Pop();
return self;
}
CViewFactory* CViewFactory::NewLC()
{
CViewFactory* self = new (ELeave) CViewFactory();
CleanupStack::PushL( self );
self->ConstructL();
return self;
}
CViewFactory::~CViewFactory()
{
iMap.Close();
}
void CViewFactory::ConstructL()
{
}
TBool CViewFactory::RegistViewL( TUid aViewId, TMapModel::CreateViewCallback aCreateCallback )
{
iMap.AppendL( TMapModel( aViewId, aCreateCallback ) );
return ETrue;
}
CAknView* CViewFactory::CreateViewL( TUid aViewId )
{
CAknView* view = NULL;
TInt i = 0;
for ( i = 0; i < iMap.Count(); i++ )
{
if ( iMap[i].ViewId() == aViewId )
{
TMapModel::CreateViewCallback callback =
iMap[i].CreateCallback();
return callback();
}
}
if ( i == iMap.Count() )
{
User::Leave( KErrNotFound );
}
return view;
}
(5) 使用方法
在appui类的构造方法中实例化factory类,然后进行类的注册。
如
void CMyAppUi::ConstructL()
{
BaseConstructL( EAknEnableSkin );
iViewFactory = CViewFactory::NewL();
// Regist view
iViewFactory->RegistViewL( KCatViewId, CreateCatViewL );
iViewFactory->RegistViewL( KDogViewId, CreateDogViewL );
// Create view
CAknView* view = iViewFactory->CreateViewL( KCatId );
CleanupStack::PushL( view );
AddViewL( view );
SetDefaultViewL( *view );
CleanupStack::Pop();
}
- Symbian常用设计模式之可伸缩对象工厂
- Symbian常用设计模式之可伸缩对象工厂
- 常用设计模式之简单工厂模式
- 常用设计模式之简单工厂模式
- 常用设计模式之抽象工厂模式
- 可伸缩的系统设计模式
- 可伸缩系统的设计模式
- 常用设计模式之工厂方法模式、抽象工厂模式
- Java常用设计模式之工厂模式(Factory)
- c#面向对象设计模式之工厂模式
- PHP生成对象之设计模式—工厂方法模式
- 用来创建对象的设计模式之抽象工厂模式
- 面向对象设计模式实践之抽象工厂模式
- 可伸缩系统的设计模式(译)
- [服务器开发]可伸缩系统的设计模式(译)
- 设计模式之工厂:
- 设计模式之工厂
- 设计模式之工厂
- C++判断IP
- 中国Flex开发者论坛正式启用
- jQuery插件
- 关于sizeof()和strncpy的一点小体会
- Flex + Rails构建Web Application
- Symbian常用设计模式之可伸缩对象工厂
- proxool 配置
- 揭秘IT人才特点:中美印日四国程序员比较
- josso单点认证 安装配置
- 每日两句英语-7/17/2009
- sql很好的学习blog
- Tomcat 6下配置使用Proxool的JNDI 连接池
- Rethinking Recommendation Engines
- 完整的clsFtp类