蘇阿細 - 享元模式
type: channel
link: https://www.wangchouchou.com/tag/%E4%BA%AB%E5%85%83%E6%A8%A1%E5%BC%8F/
items: 结构型模式-享元模式

结构型模式-享元模式
type: item
date: 2022-09-16T14:43:00+00:00
description: （1）概述运用共享技术来有效支持大量细粒度对象的复用，通过共享已经存在的对象来大幅度减少需要创建对象的数量、避免大量相似对象的开销，从而提高系统资源的利用率（2）结构享元模式存在两种状态：内部状态，即不会随着环境的改变而改变的可共享部分外部状态，内部状态反之享元模式实现的要领就是区分应用中的这两种状态，并将外部状态外部化包含的角色：抽象享元角色：通常是一个接口或抽象类，声明具体享元类公共的方法，这些方法可以向外界提供享元对象的内部数据（内部状态），同时也可以通过这些方法来设置外部数据（外部状态）具体享元角色：它实现了抽象享元类，称为享元对象；在具体享元类中为内部状态提供了存储空间（可以结合单例模式来设计具体享元类）非享元角色：并不是所有抽象享元类的子类都需要被共享不能被共享的子类可以设计为非共享具体享元类，当需要它时，可以直接通过实例化创建享元工厂角色：负责创建和管理享元角色，当客户对象请求一个享元对象时，享元工厂检查系统中是否存在该对象，有则直接提供，反之则创建一个对应的新的享元对象（3）案例以俄罗斯方块为例：抽象享元角色public abstract class AbstractBox { /** * 获取图像 * * @return */ public abstract String getShape(); public void display(String color) { System.out.println("方块形状：" + getShape() + "，颜色：" + color); } }具体享元角色public class IBox extends AbstractBox { @Override public String getShape() { return "I"; } } public class LBox extends AbstractBox { @Override public String getShape() { return "L"; } } public class OBox extends AbstractBox { @Override public String getShape() { return "O"; } }享元工厂public class BoxFactory { private HashMap<String, AbstractBox> map; private BoxFactory() { map = new HashMap<>(); map.put("I", new IBox()); map.put("L", new LBox()); map.put("O", new OBox()); } /** * 饿汉式 * * @return */ public static BoxFactory getInstance() { return factory; } private static BoxFactory factory = new BoxFactory(); /** * 根据名称获取图形 * * @param key * @return */ public AbstractBox getShape(String key) { return map.get(key); } }Clientpublic class Client { public static void main(String[] args) { //获取I型盒子 AbstractBox boxI = BoxFactory.getInstance().getShape("I"); boxI.display("灰色"); //获取L型盒子 AbstractBox boxL = BoxFactory.getInstance().getShape("L"); boxL.display("蓝色"); //获取O型盒子 AbstractBox boxO1 = BoxFactory.getInstance().getShape("O"); boxO1.display("绿色"); //获取O图形 AbstractBox boxO2 = BoxFactory.getInstance().getShape("O"); boxO2.display("红色"); //验证两个O型盒子是否为同一对象 System.out.println("两个O型盒子是否为同一对象:" + (boxO1 == boxO2)); } }（4）优缺点极大地减少了内存中相同或相似对象的数量，节约了资源享元模式中的外部状态相对独立，且不影响内部状态为了使对象可以共享，需要装享元对象的部分状态外部化，增加了系统的复杂度（5）使用场景系统中有大量相同或…