iT邦幫忙

2021 iThome 鐵人賽

DAY 19
1
Software Development

淺談物件導向與Design Pattern介紹系列 第 19

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 - 前端?後端?你早晚都要全端的,何不從現在開始?


上一篇
IT鐵人DAY 18-Adapter 適配器模式
下一篇
IT鐵人DAY 20-Proxy 代理模式
系列文
淺談物件導向與Design Pattern介紹30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言