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

享元工厂角色

负责创建和管理享元角色。要想达到共享的目的,这个角色的实现是关键!

客户端角色

维护对所有享元对象的引用,而且还需要存储对应的外部状态。

单纯享元模式和创建型的简单工厂模式实现上非常相似,但是它的重点或者用意却和工厂模式截然不同。工厂模式的使用主要是为了使系统不依赖于实现得细节;而在享元模式的主要目的是避免大量拥有相同内容对象的开销。

复合享元模式结构重要核心模块:

抽象享元角色

为具体享元角色规定了必须实现的方法,而外部状态就是以参数的形式通过此方法传入。在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的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值