[GoF设计模式]Flyweight模式和State模式的C++实现

本文介绍了享元模式和状态模式的设计原则及其实现方法。享元模式通过共享对象减少内存消耗,适用于大量轻量级对象的情况;状态模式使对象能够在不同状态下表现出不同的行为,简化了复杂的条件判断逻辑。

【Flyweight模式】

 一个应用程序创建了太多的对象,会造成很大的存储开销,特别是大量轻量级的对象。对于这种情况,可以将对象的状态分成外部状态和内部状态,将可以被共享(不变化)的状态作为内部状态存储在对象中,而外部状态则可以将外部对象作为参数传递给对象。Flyweight有一个类似工厂模式的对象构造工厂,当程序需要一个对象时就会向FlyweightFactory发出请求对象的消息,该工厂拥有一个管理、存储对象的仓库(或者称为对象池),FlyweightFactory中会遍历对象池,如果存在则直接返回,否则创建并返回。同时程序也可以向FlyweightFactory请求不被共享的对象。

【图解】

以纯文本为例,每个字符CharFlyweight为共享的轻量级对象,而由这些字符构成的行则为非共享的对象RowFlyweight,而TextFlyweightFactory则管理其共享对象的对象池。当用户向该工厂请求字符时,就从对象池中取得,而当用户向该工厂请求字符串时候则通过创建非共享的RowFlyweight获取,但此种每个字符的获取仍然向TextFlyweightFactory共享对象的对象池提出请求。

1

 

【程序】

  

 

 

 

 

【输出】

2

 

 

【State模式】

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。FSM有限状态自动机也是一个典型的状态模式,对输入有同的相应(状态转移),通常情况会写很多switch case 或者 if else语句,当状态数目很多时,维护一组swith case 很困难,状态逻辑和动作没能实现分开,在系统实现中,动作的实现代码直接写在状态逻辑中,使得系统的扩展性和维护性得不到保证。state模式也有问题是,状态逻辑分散到了很多state子类中,很难看到整个逻辑状态图,代码的维护难度也会加大。一般而言状态采用单例模式。注意单例模式中cpp文件中现代码,单例的初始化 GreenState* GreenState::_instance=0;必须在cpp文件中,在h文件中直接初始化或者不写编译会出问题。

【图解】

以交通灯的红灯和绿灯状态为例子(简单起见省略黄灯状态),交通灯(Context),红灯/绿灯状态(Concrete State,状态采用单例模式)

2

 

【程序】

 

 

 

 

 

 

RedState和GreenState类似,省略.....

 

 

 

【输出】

1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值