使用场景
一个系统有大量相同或者相似的对象,造成内存的大量耗费。
对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。
在使用享元模式时需要维护一个存储享元对象的享元池,而这需要耗费一定的系统资源,因此,应当在需要多次重复使用享元对象时才值得使用享元模式。
程序猿实例
**单纯享元模式实例:**例子完全就是核心点的文字翻译代码,不做过多解释。
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学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!