Android设计模式之享元模式(Flyweight Pattern)

一 享元模式介绍:

1.1 使用享元模式有什么好处?
享元模式是对象池的一种实现,主要目的是用来尽可能减少内存使用量。适合于存在大量重复对象的场景,来缓存可共享的对象,达到对象共享,避免创建过多对象的效果,这样可以提升性能。

1.2 关于享元对象?
享元对象中的部分状态可以共享,可以共享的状态为内部状态(内蕴状态),内部状态不会随环境变化,不可共享的状态是外部状态(外蕴状态),外部状态随外部环境变化。

1.3 享元模式的核心—-如何缓存?
在享元模式中会建立一个对象容器,可以是 一个Map,它的键是享元对象的内部状态,它的值就是享元对象本身。客户端程序通过这个内部状态从享元工厂中获取享元对象,如果有缓存则使用缓存对象,如果没有则创建一个享元对象并且存入容器,这样一来就避免了创建多个对象的问题。

二 享元模式的UML类图

享元模式分为单纯享元模式和复合享元模式两种,单纯享元模式的UML类图如图:
角色介绍:
(1)Flyweight: 抽象对象基类或者接口,为具体享元角色规定了必须实现的方法,外在状态就是以参数的形式通过此方法传入。
(2)ConcreteFlyweight: 具体享元角色,实现抽象角色规定的方法,并负责内部状态提供存储空间。
(3)FlyweightFactory:享元工厂角色。负责管理享元对象池和创建享元对象,是实现对象缓存的核心。
(4)Client:客户端角色。维护享元对象的引用和调用对象相应的方法。

这里写图片描述

复合享元模式的UML类图如图:
其中多了一个角色是复合享元角色ConcreteConpositeFlyweight: 它所代表的对象是不可以共享的,并且可以分解成为多个单纯享元对象的组合。

这里写图片描述

三 单纯享元模式的简单示例

示例背景:

我们都在某06网站买过火车票,在购票时,当我们设置好出发地和目的地之后,每次请求某06都会返回一个查询的车票结果,假设今年十一你要和你的女朋友从北京去厦门,而北京到厦门就一列火车Z307次。那么十一旅游高峰,很可能有数以万计的人都在不间断的请求从北京到厦门的Z307次车票数据,如果每次都创建一个查询的车票结果,那么必然会大量重复创建对象,销毁,使得GC任务很重。那么使用享元模式处理,创建一个享元对象Ticket,出发地和目的地是享元对象的内部状态,车票的种类(硬座,硬卧,软卧)为享元对象的外部状态,在用户查询北京到厦门的火车时,优先使用缓存,如果没有缓存则重新创建一个享元对象,并存放到Map容器中。

首先创建一个Ticket接口,该接口定义了展示车票信息的函数,这相当于类图中的Flyweight。

public interface Ticket {
    public 
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值