Chinaunix首页 | 论坛 | 博客
  • 博客访问: 347134
  • 博文数量: 78
  • 博客积分: 3380
  • 博客等级: 中校
  • 技术积分: 857
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-16 19:39
文章分类

全部博文(78)

文章存档

2011年(31)

2010年(47)

分类: WINDOWS

2011-08-10 11:34:37

面向对象系统设计问题
在面向对象系统设计中经常可以遇到以下的两类问题:   
 1)为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。
 这样我们可以通过声明一个指向基类的指针来指向实际的子类实现,达到了多态的目的。
 这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就编写诸如new ×××;的代码。
  这里带来两个问题:
  1.客户程序员必须知道实际子类的名称(当系统复杂后,命名将是一个很不好处理的问题,为了处理可能的名字冲突,有的命名可能并不是具有很好的可读性和可记忆性,就姑且不论不同程序员千奇百怪的个人偏好了。),
  2.程序的扩展性和维护变得越来越困难。   
 2)还有一种情况就是在父类中并不知道具体要实例化哪一个具体的子类。这里的意思为:假设我们在类A中要使用到类B,B是一个抽象父类,在A中并不知道具体要实例化那一个B的子类,但是在类A的子类D中是可以知道的。在A中我们没有办法直接使用类似于new ×××的语句,因为根本就不知道×××是什么。编辑本段Factory模式解决方案
以上两个问题也就引出了Factory模式的两个最重要的功能:   
1. 定义创建对象的接口,封装了对象的创建;   
2. 使得具体化类的工作延迟到了子类中。   
■模式选择   
我们通常使用Factory模式来解决上面给出的两个问题。
在第一个问题中,我们经常就是声明一个创建对象的接口,并封装了对象的创建过程。Factory这里类似于一个真正意义上的工厂(生产对象)。
在第二个问题中,我们需要提供一个对象创建对象的接口,并在子类中提供其具体实现(因为只有在子类中可以决定到底实例化哪一个类)。

1. 简单工厂模式(Simple Factory)
2. 工厂方法模式(Factory Method)
3. 抽象工厂模式(Abstract Factory)
 
举例:
 ///////////////////////////////////////
 enum EnSysTools
 {
  SYSTOOL_QUERY = 0, // 查询
  SYSTOOL_NETWORK, // 路网规划
  SYSTOOL_LOCATION, // 匹配
  SYSTOOL_TMC, // TMC
  SYSTOOL_GUIDE, // 引导
  SYSTOOL_DATAMNG, // 数据管理
  SYSTOOL_DSPMNG, // 显示数据管理,内部使用
   SYSTOOL_FONT, // 字体渲染
  SYSTOOL_CONFIG, // 引擎配置,内部使用
  SYSTOOL_MAPCFG, // 地图路径配置文件,内部使用
  SYSTOOL_COUNT
 };
/////////////////////////////////////////
class IGIS_Tool
{
public:
 IGIS_Tool(){}
 virtual ~IGIS_Tool(){}
};
////////////////////////////////////////////
//单例模式和工厂模式联用
class CSDEControler 
{
 public:
  static CSDEControler* GetSDEControl();
  ~CSDEControler();  
  IGIS_Tool* GetSysTool(EnSysTools tool);  
 private:
  IGIS_Tool *m_ptools[SYSTOOL_COUNT];  
 private:
  CSDEControler();
  static CSDEControler *m_pSelf;
};
CSDEControler* CSDEControler::m_pSelf = NULL;
CSDEControler::~CSDEControler()
{}
CSDEControler::CSDEControler()
{
 for (S32 i=0; i  m_ptools[i] = NULL;
}
CSDEControler* CSDEControler::GetSDEControl()
{
 if (m_pSelf == NULL)
  m_pSelf = new CSDEControler;
 return m_pSelf;
}
IGIS_Tool* CSDEControler::GetSysTool(EnSysTools tool)
{
 if (m_ptools[tool] == NULL)
 {
  switch (tool)
  {
  case SYSTOOL_DATAMNG:
   m_ptools[tool] = new CMapDataMng;
   break;
  case SYSTOOL_DSPMNG:
   m_ptools[tool] = new CGIS_DspMapMng;
   break;
  case SYSTOOL_NETWORK:
   m_ptools[tool] = new CRouteMng;
   break;
  case SYSTOOL_QUERY:
   m_ptools[tool] = new CQueryMng;   
   break;
  case SYSTOOL_GUIDE:
   m_ptools[tool] = new CNavGuide;
   break;
  case SYSTOOL_LOCATION:
   m_ptools[tool] = new CMiniLocation;
   break;
  case SYSTOOL_TMC:
   m_ptools[tool] = new CTmcDataMng;
   break;
   case SYSTOOL_FONT:
    m_ptools[tool] = new CFontRender;
    break;
  case SYSTOOL_CONFIG:
   m_ptools[tool] = new CIniCfg();   
   break;
  case SYSTOOL_MAPCFG:  
   m_ptools[tool] = new CMapIniCfg();
   break;
  default:
   break;
  }
 }
 return m_ptools[tool];
}
//////////////////////////////////////////////////////
子类:
class CTmcDataMng : public IGIS_Tool
{
 public:
  CTmcDataMng();
  virtual ~CTmcDataMng();  
};
////////////////////////////////////////////////////////
应用:
CTmcDataMng *pTmc = (CTmcDataMng *)CSDEControler::GetSDEControl()->GetSysTool(SYSTOOL_TMC);//获取tmc句柄
阅读(677) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~