首页 > 其他分享 >初识设计模式 - 享元模式

初识设计模式 - 享元模式

时间:2022-10-12 09:01:44浏览次数:45  
标签:享元 状态 对象 初识 Flyweight 设计模式 public intrinsicState

简介

古代的活字印刷术就有点像享元模式,活字印刷就是将每个字模做出来,再印刷时再选取需要的字模到印刷板上,这样就构成了一页书的印刷板。这样的活字印刷大大提升了效率,减少了印刷板的空间。

在享元模式中,存储共享实例对象的地方称为享元池(Flyweight Pool)。类比到上述的活字印刷术中,放置字模的地方就是享元池。

享元模式能做到共享的关键是区分了内部状态和外部状态,它们的简单释义是:

  • 内部状态:存储在享元对象内部且不跟随环境变化而改变的状态,内部状态可以在对象之间共享
  • 外部状态:通常由客户端保存,当需要时再传入享元对象中的状态,会跟随环境变化而改变,不可以在对象之间共享。

典型示例

一个典型的享元工厂类的代码示例如下:

public class FlyweightFactory {
    // 使用 HashMap 定义享元池
    private final HashMap<String, Flyweight> flyweights = new HashMap<>();

    public Flyweight getFlyweight(String key) {
        // 如果对象存在,直接从享元池中获取
        if (flyweights.containsKey(key)) {
            return (Flyweight) flyweights.get(key);
        } else {
            // 如果对象不存在,先创建一个新的对象添加到享元池中,然后返回
            Flyweight fw = new ConcreteFlyweight();
            flyweights.put(key, fw);
            return fw;
        }
    }
}

一个典型的享元抽象类的代码示例如下:

public abstract class Flyweight {
    // 内部状态作为成员对象,同一个享元对象其内部状态是一致的
    protected Object intrinsicState;

    public Flyweight(Object intrinsicState) {
        this.intrinsicState = intrinsicState;
    }

    public void operation(Object extrinsicState) {
        // 外部状态在使用时由外部提供,每一次都可以不同
    }
}

通常,实际会根据业务情况定义具体享元类,代码示例如下:

public class ConcreteFlyweight extends Flyweight {
    public ConcreteFlyweight(Object intrinsicState) {
        super(intrinsicState);
    }

    @Override
    public void operation(Object extrinsicState) {
        // 结合内部状态 intrinsicState 以及方法参数传入的 extrinsicState 完成具体逻辑
    }
}

总结

优点

享元模式的主要优点如下:

  • 极大地减少内存中对象的数量,节约了系统资源,提高了系统性能
  • 享元模式的外部状态相对独立,而且不会影响其内部状态,从而使得享元对象可以在不同的环境中被共享

缺点

享元模式的主要缺点如下:

  • 享元模式需要分离出内部状态和外部状态,从而使得系统变得复杂,这使得程序的逻辑复杂化
  • 为了使对象可以共享,享元对象需要将部分状态外部化,而读取外部状态将使得运行时间变长

适用场景

享元模式的适用场景如下:

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

源码

在 Java 类库中的 String 类就使用了享元模式,使用字面量创建的对象是共享的,而不会重新为此分配内存空间。

标签:享元,状态,对象,初识,Flyweight,设计模式,public,intrinsicState
From: https://www.cnblogs.com/fatedeity/p/16783274.html

相关文章

  • 设计模式-行为型模式之观察者
    观察者模式也可以理解为:发布订阅模式发布者状态更新,通过管道接口实现订阅者动态更新1classMiddleware:2"""3发布者和订阅者交互类40、订阅......
  • 18.设计模式-模板方法
    //1.定义模板抽象父类,将特有的业务定义为抽象方法,定义钩子函数//2.子类继承抽象父类,实现抽象方法//3.测试publicabstractclassCake{//定义成final,禁止子类重写......
  • 【JS设计模式笔记】神奇的魔术师-简单工厂模式(创建型)
    简单工厂模式(SimpleFactory):又叫静态工厂方法,由一个工厂对象决定创建某一种产品对象类的实例。主要用来创建同一类对象。第一次需求开发一个登录模块的需求,用户名输入框......
  • 4. 设计模式--原型模式
    原型模式在java中我们知道通过new关键字创建的对象是非常繁琐的(类加载判断,内存分配,初始化等),在我们需要大量对象的情况下,原型模式就是我们可以考虑实现的方式。原型......
  • Java设计模式之 装饰模式实验报告书
    Java设计模式之装饰模式实验报告书姓名:班级:学号:实验三:装饰模式的应用一、实验目的熟练使用JAVA实现装饰模式,理解设计模式的模式动机,掌握模式结构,学习如何使用代码实现......
  • 设计模式二(建造者模式)
    建造者模式   设计模式的关键步骤是    importjava.util.ArrayList;importjava.util.List;publicclassMeal{privateList<Item>items=......
  • 初识node.js[2]
    一、什么是node.jsnode.jsisajavascriptruntimebuiltonchrome'sV8JavaScriptengine.node.js是一个基于chromeV8引擎的JavaScript运行环境。官网:https://nod......
  • 初识Linux(三)------ Linux 文件与目录管理
    在前一章我们认识了Linux系统下的文件权限概念以及目录的配置说明。在这个章节当中,我们就直接来进一步的操作与管理文件及目录,包括在不同的目录间变换、创建与删除目录、......
  • 初识node.js[1]
    一、浏览器中JavaScript组成部分JS核心语法【变量、数据类型;循环、分支、判断;函数、作用域、this;etc...】WebApi【DOM;BOM;Ajax;...】为什么JavaScript可以在浏览器内运行......
  • 09-Go设计模式-模板方法模式
    模板方法模式示例代码/*模板方法模式模板方法模式中的角色和职责AbstractClass(抽象类):在抽象类中定义了一系列基本操作(PrimitiveOperations),这些基本操作可以是具体......