使用场景


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

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

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

程序猿实例


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

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学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
715146644866)]

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

[外链图片转存中…(img-ExBjbO4n-1715146644867)]

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

[外链图片转存中…(img-pKziNUVz-1715146644868)]

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

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

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

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐