设计模式(一):单例模式

设计模式简介

设计模式简介

  • 什么是设计模式?
    设计模式就是一套呗反复使用,多数人知晓的、经过分类的、代码设计经验的总结
  • 使用设计模式的目的
    是为了提高代码的可重用性,让代码容易被同行理解、维护和扩张。

设计的基本原则

  • 高内聚,低耦合
  • 面向对象、面向接口编程
  • 多用组合,少用继承
  • 对扩展开放,对修改封闭

多用组合,少用继承

  • 引入新功能的时候,往往会从现有代码内,找个功能相近的类,从他继承,然后把新功能追加进去。
  • 随着项目的进展,新功能的扩充,子类和父类就越来越紧密,很难维护。

下面这个接口是UI层提出的

interface iSectorDataMgr
{
	StartSectorSrv();			//启动
	GetReady();					//准备好了?
	GetSubSectorIDs();		//取子模块
	GetSecurities();			//取股票
	GetSearchRange();		//搜索范围
	SetSearchRange();		//搜索范围
	SectorSearch();			//执行搜索
}

为了UI的方便性,这个接口也算合理。并且方法是一个一个逐步加上去的。
但中间层实现的时候,把所有功能都写在一个类内,或者不断的从现有类派生出子类来扩充功能,就不太合适。

合理的做法是:

  • 把功能相近的方法,合并后,用小类各自实现。
  • 然后把这些小类,组合到一个大类内,提供给ui使用。

最终把大类拆分成四个小类

XPSearchDataMgr:
public ISectorDataMgr
{
	m_setctor_instance;		//单例
	m_sector_search;			//搜索
	m_sector_cache;				//缓存
	m_async;							//异步搜索
}

对扩展开放,对修改封闭

  • 需求
    软件开发过程中,需要扩充功能。
  • 矛盾
    从外界看来,现有代码只要稍微修改,就能满足需求,但,修改的过程很痛苦,修改的结果是一塌糊涂,错误百出。

本来只是星星之火,修改后已经可以燎原了。

  • 期望
    在增加新功能的过程中,开发完毕测试完毕的模块,不需要修改。
    只要通过系统配置或对象组装,就能把新开发的功能模块,插入现有系统。

各种模式介绍

设计模式分类

  • 创建型模式:用来获取对象
    单例模式:Singleton
    工厂方法模式:Factory
    抽象工厂模式:Abstract Factory
    建造者模式:Builder
    原型模式:Prototype

单例模式:Singleton

用法:

sector* p=sector_factory::GetInstance()->Create()
  • 大的程序模块,会不自觉的使用很多全局变量。
  • 全局变量的初始化/创建/销毁,往往难管理。
  • 可以把这些全局变量,放到一个类中,然后把这个类做成单例
  • 这样只需维护一个全局变量就行。
//全局变量
A* g_a=new A();
B* g_b=B::GetInstance()->create()

//封装到一个类中
class AppGlobals
{
	static AppGlobals *GetInstance();
	A* m_a;
	B* m_b;
}
  • 注意点:
    多线程的应用程序访问和操作单例的全局变量的时候,必须枷锁。
    单例的每个方法,必须加锁。
    加锁一般在单例对象内部实现。
    锁太多,小心发生死锁。

创建单例对象的时候,分懒汉模式和饿汉模式。

懒汉模式在对象呗使用到的时候,才创建对象。
饿汉模式在程序启动的时候,就提前创建好对象。


AppGlobals *GetInstance()
{
	if(s_globals==null)
		s_globals=new xxx;
	return s_globals;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值