IT铁人DAY 19-Flyweight 享元模式

  一讲到Flyweight,它最主要工作就是要减少记忆体的使用量,至於要怎麽做来能达到这样的效果呢?现在就让我们艺起来了解吧!


问题情境与解析

  大家在使用电脑的时候,最基本的技能肯定包含打字,每当在文字编辑器输入一个字,电脑就会创建一个「字」的类别,而「字」的属性大致上有字型、颜色、大小等等。

  假设在没有使用Flyweight的情况下,每输入一个字就会创造一个字的类别,无形中系统的记忆体就很有可能很快地被占满,导致性能变差;反之,使用者第一次输入「A」,会产生一个「A」的类别,若使用者再输入一次「A」,则会返回之前所创建的「A」类别,如此就不会在无意间创出许多重复的类别,避免大部分的记忆体被占用。

  而物件有分[内在状态]与[外在状态],内在状态就像是「A」的字型、颜色、大小,能够再不同的物件之间做共享,因为他们彼此相似;而外在状态就像是「A」的行、列,表示了这个字在此文件的位置,即使是相同物件,也不会在同样的文件里有相同的位置,故这些属性也不会相似,因此就不能在不同物件间共享。

Class Diagram

https://ithelp.ithome.com.tw/upload/images/20211004/20140743u5sHIiQNJa.png

Skeleton Code

import java.util.HashMap;
class Context {
    private Type intrinsic;

    private Flyweight flyweight;

    FlyweightFactory factory = new FlyweightFactory();

    public Context(Type intrinsic, Type extrinsic) {
        this.intrinsic = intrinsic;
        this.flyweight = factory.getFlyweight(extrinsic);
    }

    public void operation() {
        flyweight.operation(intrinsic);
    }
}

class FlyweightFactory {
    private static HashMap <Type, Flyweight> f =new HashMap<Type, Flyweight>();

    public static Flyweight getFlyweight(Type extrinsic) {
        Flyweight fly = null;

        if (f.containsKey(extrinsic)) {
            fly = f.get(extrinsic);
        } else {
            fly = new Flyweight();
            f.put(extrinsic, fly);
        }

        return fly;
    }
}

class Flyweight {
    private Type extrinsic;
    
    public void operation(Type intrinsic) {
        // do something
    }
}

  虽然Flyweight很常与Factory协同合作,但它属於Structural Patterns之一,而不是和Factory一样是Creational Patterns。如果你的程序有大量重复的物件,就可以试着将Flyweight Pattern套用在你的程序上面,如此一来就可以节省大量的记忆体,电脑性能也不会因为因此而降低。


除此之外,也欢迎大家走走逛逛关於我们团队夥伴的文章

lu23770127 - SASS 基础初学三十天

10u1 - 糟了!是世界奇观!

juck30808 - Python - 数位行销分析与 Youtube API 教学

SiQing47 - 前端?後端?你早晚都要全端的,何不从现在开始?


<<:  Day19 :【TypeScript 学起来】More on Functions

>>:  [Day19]ISO 27001 附录 A.7 人力资源安全

(31) 试着学 Hexo - 番外篇之常见问题

前言 这一篇是完赛後的总结篇,虽然说是总结篇,但其实还是要讲一些 Hexo 常见的问题。 小心关键字...

【Day 14】海绵宝宝的神奇海螺:对 AWS 发出 Support

tags: 铁人赛 AWS business support codepipeline codebu...

D29 - 「来互相伤害啊!」:天时地利

互殴之前当然要先有场地才行,让我们建立 Phaser 场景吧! 建立场景 首先建立 src\comp...

iOS APP 开发 OC 第二十天,@class 物件互相引用 重现文字狱烧书,苏轼冤狱而死。

tags: OC 30 day 创建一个类 如何创建一个书的class? 首先点击add File的...

Day 3 - A short introduction to gcc usage - 2

Today I will introduce the order of compiling. Fir...