享元工厂角色
负责创建和管理享元角色。要想达到共享的目的,这个角色的实现是关键!
客户端角色
维护对所有享元对象的引用,而且还需要存储对应的外部状态。
单纯享元模式和创建型的简单工厂模式实现上非常相似,但是它的重点或者用意却和工厂模式截然不同。工厂模式的使用主要是为了使系统不依赖于实现得细节;而在享元模式的主要目的是避免大量拥有相同内容对象的开销。
复合享元模式结构重要核心模块:
抽象享元角色
为具体享元角色规定了必须实现的方法,而外部状态就是以参数的形式通过此方法传入。在Java中可以由抽象类、接口来担当。
具体享元角色
实现抽象角色规定的方法。如果存在内部状态,就负责为内部状态提供存储空间。
复合享元角色
它所代表的对象是不可以共享的,并且可以分解成为多个单纯享元对象的组合。
享元工厂角色
负责创建和管理享元角色。要想达到共享的目的,这个角色的实现是关键!
客户端角色
维护对所有享元对象的引用,而且还需要存储对应的外部状态。
使用场景
一个系统有大量相同或者相似的对象,造成内存的大量耗费。
对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。
在使用享元模式时需要维护一个存储享元对象的享元池,而这需要耗费一定的系统资源,因此,应当在需要多次重复使用享元对象时才值得使用享元模式。
程序猿实例
**单纯享元模式实例:**例子完全就是核心点的文字翻译代码,不做过多解释。
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 {
学习福利
【Android 详细知识点思维脑图(技能树)】
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
[外链图片转存中…(img-FNmLstjU-1726069898206)]
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。