设计模式(结构型)之享元模式(Flyweight Pattern)

使用场景


一个系统有大量相同或者相似的对象,造成内存的大量耗费。

对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。

在使用享元模式时需要维护一个存储享元对象的享元池,而这需要耗费一定的系统资源,因此,应当在需要多次重复使用享元对象时才值得使用享元模式。

程序猿实例


**单纯享元模式实例:**例子完全就是核心点的文字翻译代码,不做过多解释。

package yanbober.github.io;

import java.util.HashMap;

import java.util.Map;

//抽象享元角色类

interface ICustomerString {

//外部状态以参数的形式通过此方法传入

void opt(String state);

}

//具体享元角色类

class CustomerStringImpl implements ICustomerString {

//负责为内部状态提供存储空间

private Character mInnerState = null;

public CustomerStringImpl(Character mInnerState) {

this.mInnerState = mInnerState;

}

@Override

public void opt(String state) {

System.out.println("Inner state = "+this.mInnerState);

System.out.println("Out state = "+state);

}

}

//享元工厂角色类

//一般而言,享元工厂对象在整个系统中只有一个,因此也可以使用单例模式

class CustomerStringFactory {

private Map<Character, ICustomerString> map = new HashMap<>();

public ICustomerString factory(Character state) {

ICustomerString cacheTemp = map.get(state);

if (cacheTemp == null) {

cacheTemp = new CustomerStringImpl(state);

map.put(state, cacheTemp);

}

return cacheTemp;

}

}

//客户端

public class Main {

public static void main(String[] args) {

CustomerStringFactory factory = new CustomerStringFactory();

ICustomerString customerString = factory.factory(new Character(‘Y’));

customerString.opt(“YanBo”);

customerString = factory.factory(new Character(‘B’));

customerString.opt(“Bob”);

customerString = factory.factory(new Character(‘Y’));

customerString.opt(“Jesse”);

}

}

运行结果:

Inner state = Y

Out state = YanBo

Inner state = B

Out state = Bob

Inner state = Y

Out state = Jesse

上边示例结果一目了然可以看出来简单享元模式的特点。

复合享元模式实例:

如下例子就是一个复合享元模式,添加了复合对象,具体如下:

package yanbober.github.io;

import java.util.*;

//抽象享元角色类

interface ICustomerString {

//外部状态以参数的形式通过此方法传入

void opt(String state);

}

//具体享元角色类

class CustomerStringImpl implements ICustomerString {

//负责为内部状态提供存储空间

private Character mInnerState = null;

public CustomerStringImpl(Character mInnerState) {

this.mInnerState = mInnerState;

}

@Override

public void opt(String state) {

System.out.println("Inner state = "+this.mInnerState);

System.out.println("Out state = "+state);

}

}

//复合享元对象

class MultipleCustomerStringImpl implements ICustomerString {

private Map<Character, ICustomerString> map = new HashMap<>();

public void add(Character key, ICustomerString value) {

map.put(key, value);

}

@Override

public void opt(String state) {

ICustomerString temp;

for (Character obj : map.keySet()) {

temp = map.get(obj);

temp.opt(state);

}

}

}

//享元工厂角色类

class CustomerStringFactory {

//一般而言,享元工厂对象在整个系统中只有一个,因此也可以使用单例模式

private Map<Character, ICustomerString> map = new HashMap<>();

//上例的单纯享元模式

public ICustomerString factory(Character state) {

ICustomerString cacheTemp = map.get(state);

if (cacheTemp == null) {

cacheTemp = new CustomerStringImpl(state);

map.put(state, cacheTemp);

}

return cacheTemp;

}

//复合享元模式

public ICustomerString factory(List states) {

MultipleCustomerStringImpl impl = new MultipleCustomerStringImpl();

for (Character state : states) {

impl.add(state, this.factory(state));

}

return impl;

}

}

//客户端

public class Main {

public static void main(String[] args) {

List states = new ArrayList<>();

states.add(‘Y’);

states.add(‘A’);

states.add(‘N’);

states.add(‘B’);

states.add(‘O’);

states.add(‘Y’);

states.add(‘B’);

CustomerStringFactory factory = new CustomerStringFactory();

ICustomerString customerString1 = factory.factory(states);

ICustomerString customerString2 = factory.factory(states);

customerString1.opt(“Mutex object test!”);

}

}

总结一把


从上面代码你可以发现,由于享元模式的复杂,实际应用也不是很多,这是我们更加无法看清他的真面目了。不过享元模式并不是鸡肋,它的精髓是共享,是对我们系统优化非常有好处的,而且这种思想已经别越来越多的应用,这应该就算是享元模式的应用了吧。

享元模式优点:

  • 可以极大减少内存中对象的数量,使得相同或相似对象在内存中只保存一份,从而可以节约系统资源,提高系统性能。

结尾

最后,针对上面谈的内容,给大家推荐一个Android资料,应该对大家有用。

首先是一个知识清单:(对于现在的Android及移动互联网来说,我们需要掌握的技术)

泛型原理丶反射原理丶Java虚拟机原理丶线程池原理丶
注解原理丶注解原理丶序列化
Activity知识体系(Activity的生命周期丶Activity的任务栈丶Activity的启动模式丶View源码丶Fragment内核相关丶service原理等)
代码框架结构优化(数据结构丶排序算法丶设计模式)
APP性能优化(用户体验优化丶适配丶代码调优)
热修复丶热升级丶Hook技术丶IOC架构设计
NDK(c编程丶C++丶JNI丶LINUX)
如何提高开发效率?
MVC丶MVP丶MVVM
微信小程序
Hybrid
Flutter

接下来是资料清单:(敲黑板!!!


1.数据结构和算法

2.设计模式

3.全套体系化高级架构视频;七大主流技术模块,视频+源码+笔记

4.面试专题资料包(怎么能少了一份全面的面试题总结呢~)

不论遇到什么困难,都不应该成为我们放弃的理由!共勉~

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。


《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
715393872557)]

3.全套体系化高级架构视频;七大主流技术模块,视频+源码+笔记

[外链图片转存中…(img-0UE9dnsf-1715393872558)]

4.面试专题资料包(怎么能少了一份全面的面试题总结呢~)

[外链图片转存中…(img-cKjeklG7-1715393872558)]

不论遇到什么困难,都不应该成为我们放弃的理由!共勉~

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

[外链图片转存中…(img-7yOHNI8g-1715393872559)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值