1. 程式人生 > >設計模式之享元模式(卷十一)

設計模式之享元模式(卷十一)

通過使用池的技術,有效減少了大量細粒度的物件的重複生成。

0x00 組織結構

  • Flyweight:抽象享元類,聲明瞭可以想外界提供內部狀態的方法,同時還可以設定外部狀態。
  • ConcreteFlyweight:具體享元類,通常和單例模式組合使用。
  • UnsharedConcreteFlyweight(非共享具體享元類):並不是所有的抽象享元類的子類都需要被共享,不能被共享的子類可設計為非共享具體享元類;當需要一個非共享具體享元類的物件時可以直接通過例項化建立。
  • FlyweightFactory:享元池,享元池一般設計為一個儲存“鍵值對”的集合,可以結合工廠模式進行設計。

0x01 示例

以組裝PC為例,其中CPU充當內部狀態,Computer充當外部狀態。

package com.kkk.pattern.flyweight;

/**
 * 充當享元類
 * Created by z3jjlzt on 2018/1/10.
 */
public abstract class CPU {

    //獲取內部狀態
    public abstract String getCPUName();

    //注入外部狀態
    public  void setComputer(Computer computer) {
        System.out.println("把型號為 "
+ getCPUName() + "的cpu安裝在型號為 " + computer + "的電腦上"); } } /** * 充當具體享元 * Created by z3jjlzt on 2018/1/10. */ public class AMDCPU extends CPU { private AMDCPU() {} private static class Instance{ private static final AMDCPU cpu = new AMDCPU(); } public static AMDCPU getInstance
() { return Instance.cpu; } @Override public String getCPUName() { return "AMD"; } } /** * 充當具體享元 * Created by z3jjlzt on 2018/1/10. */ public class IntelCPU extends CPU { private IntelCPU() {} private static class Instance{ private static final IntelCPU cpu = new IntelCPU(); } public static IntelCPU getInstance() { return Instance.cpu; } @Override public String getCPUName() { return "Intel"; } } /** * 充當外部狀態 * Created by z3jjlzt on 2018/1/10. */ public class Computer { private String name; public Computer(String name) { this.name = name; } @Override public String toString() { final StringBuffer sb = new StringBuffer("Computer{"); sb.append("name='").append(name).append('\''); sb.append('}'); return sb.toString(); } } import java.util.HashMap; /** * 充當共享池 * Created by z3jjlzt on 2018/1/10. */ public class CPUFactory { private static HashMap<String, CPU> fpool = new HashMap<>(); private CPUFactory() { } private static class Instance { private static final CPUFactory cf = new CPUFactory(); } public static CPUFactory getInstance() { return Instance.cf; } public static CPU getCPU(String type) { if (null == fpool.get(type)) { switch (type) { case "AMD": fpool.put("AMD", AMDCPU.getInstance()); break; case "Intel": fpool.put("Intel", IntelCPU.getInstance()); break; default: break; } } return fpool.get(type); } } /** * Created by z3jjlzt on 2018/1/10. */ public class Client { public static void main(String[] args) { CPUFactory cpuFactory = CPUFactory.getInstance(); CPU amd1 = cpuFactory.getCPU("AMD"); CPU amd2 = cpuFactory.getCPU("AMD"); CPU intel1 = cpuFactory.getCPU("Intel"); System.out.println(amd1 == amd2); System.out.println(amd1 == intel1); amd1.setComputer(new Computer("新華同方")); intel1.setComputer(new Computer("華碩")); } } 結果: package com.kkk.pattern.flyweight; /** * 充當享元類 * Created by z3jjlzt on 2018/1/10. */ public abstract class CPU { //獲取內部狀態 public abstract String getCPUName(); //注入外部狀態 public void setComputer(Computer computer) { System.out.println("把型號為 " + getCPUName() + "的cpu安裝在型號為 " + computer + "的電腦上"); } } /** * 充當具體享元 * Created by z3jjlzt on 2018/1/10. */ public class AMDCPU extends CPU { private AMDCPU() {} private static class Instance{ private static final AMDCPU cpu = new AMDCPU(); } public static AMDCPU getInstance() { return Instance.cpu; } @Override public String getCPUName() { return "AMD"; } } /** * 充當具體享元 * Created by z3jjlzt on 2018/1/10. */ public class IntelCPU extends CPU { private IntelCPU() {} private static class Instance{ private static final IntelCPU cpu = new IntelCPU(); } public static IntelCPU getInstance() { return Instance.cpu; } @Override public String getCPUName() { return "Intel"; } } /** * 充當外部狀態 * Created by z3jjlzt on 2018/1/10. */ public class Computer { private String name; public Computer(String name) { this.name = name; } @Override public String toString() { final StringBuffer sb = new StringBuffer("Computer{"); sb.append("name='").append(name).append('\''); sb.append('}'); return sb.toString(); } } import java.util.HashMap; /** * 充當共享池 * Created by z3jjlzt on 2018/1/10. */ public class CPUFactory { private static HashMap<String, CPU> fpool = new HashMap<>(); private CPUFactory() { } private static class Instance { private static final CPUFactory cf = new CPUFactory(); } public static CPUFactory getInstance() { return Instance.cf; } public static CPU getCPU(String type) { if (null == fpool.get(type)) { switch (type) { case "AMD": fpool.put("AMD", AMDCPU.getInstance()); break; case "Intel": fpool.put("Intel", IntelCPU.getInstance()); break; default: break; } } return fpool.get(type); } } /** * Created by z3jjlzt on 2018/1/10. */ public class Client { public static void main(String[] args) { CPUFactory cpuFactory = CPUFactory.getInstance(); CPU amd1 = cpuFactory.getCPU("AMD"); CPU amd2 = cpuFactory.getCPU("AMD"); CPU intel1 = cpuFactory.getCPU("Intel"); System.out.println(amd1 == amd2); System.out.println(amd1 == intel1); amd1.setComputer(new Computer("新華同方")); intel1.setComputer(new Computer("華碩")); } } 結果: true false 把型號為 AMD的cpu安裝在型號為 Computer{name='新華同方'}的電腦上 把型號為 Intel的cpu安裝在型號為 Computer{name='華碩'}的電腦上

0xff 總結

  • 優點:大大減少相同物件的數量,內外部狀態互相獨立。
  • 缺點:需要區分內外部狀態,增加系統設計難度。
  • 適用場景:一個系統有大量相同或者相似的物件,造成記憶體的大量耗費。

相關推薦

設計模式模式

通過使用池的技術,有效減少了大量細粒度的物件的重複生成。 0x00 組織結構 Flyweight:抽象享元類,聲明瞭可以想外界提供內部狀態的方法,同時還可以設定外部狀態。 ConcreteFlyweight:具體享元類,通常和單例模式組合使用。 U

Head First設計模式模式蠅量模式

logs sign face isp ria reat 定義 ogr sans 一、定義 享元模式(Flyweight Pattern)主要用於減少創建對象的數量,以減少內存占用和提高性能。這種類型的設計模式屬於結構型模式,它提供了減少對象數量從而改善應用所需的對象結構的

設計模式---對象性能模式模式Flyweight

ret 大量 根據 利用 問題 字母 只讀 時代 帶來 一:概念 通過與其他類似對象共享數據來減少內存占用 如果一個應用程序使用了太多的對象, 就會造成很大的存儲開銷。 特別是對於大量輕量級 (細粒度)的對象,比如在文檔編輯器的設計過程中,我們如果為每個字母

設計模式模式蠅量模式

設計模式之享元模式(蠅量模式) 1. 什麼是享元模式 Flyweight模式也叫享元模式,是構造型模式之一,它通過與其他類似物件共享資料來減小記憶體佔用。 換句話說就是通過共享的方式高效地支援大量細粒度的物件。 享元模式的結構: 享元模式的角色和職責:

設計模式模式Flyweight

設計模式之享元模式(Flyweight) 本篇為https://github.com/iluwatar/java-design-patterns/tree/master/flyweight閱讀筆記 場景 煉金術士的商店裡擺滿了魔法藥水。許多藥水是相同的,因此不需要為每

設計模式模式Flyweight Pattern

目的:主要用於減少建立物件的數量,以減少記憶體佔用和提高效能。 應用例項: 1、JAVA 中的 String,如果有則返回,如果沒有則建立一個字串儲存在字串快取池裡面。 2、資料庫的資料池。 程式碼: 畫圖形的 介面,描述畫這個動作: public interface Shape {

設計模式模式C++

設計模式之享元模式 享元模式,運用共享技術有效地支援大量細粒度的物件。面向物件技術可以很好地解決一些靈活性或擴充套件性問題,但在很多情況下需要在系統中增加類和物件的個數。當物件數量太多時,將導致執行代價過高,帶來效能下降等問題。享元模式正式為了解決這依賴問題而誕

設計模式模式2

本質 分離與共享。 程式碼示例 (1)定義描述授權資料的享元介面 package flyWeight; public interface FlyWeight { public b

23種設計模式模式結構型,7 Flyweight,c++實現

程式碼實現:#include<iostream>#include<list>#include<string>#include<map>usingnamespace std;classPerson{public:Person(st

java設計模式模式

並不是 計算 lov 這一 返回 實例 map() 角色 ron 當前咱們國家正在大力倡導構建和諧社會,其中一個很重要的組成部分就是建設資源節約型社會,“浪費可恥,節儉光榮”。在軟件系統中,有時候也會存在資源浪費的情況,例如在計算機內存中存儲了多個完全相同或者非常相似的

Java設計模式模式實例詳解

AI ava flyweight lan trac home erro lin 代碼 本文實例講述了Java設計模式之享元模式。分享給大家供大家參考,具體如下: 解釋一下概念:也就是說在一個系統中如果有多個相同的對象,那麽只共享一份就可以了,不必每個都去實例化一個對象。比如

設計模式的藝術 結構性模式模式

前言 知道圍棋的都知道圍棋有兩種顏色的棋子,黑色和白色,不同的地方就在於他們所放置的位置不同,大體是一樣的,所以廠家生產的時候也就是批量的進行生產,反正棋子放哪他們並不需要操心,在計算機中也會存在著很多相似的物件,如果相同的物件太多將導致系統執行代價過高,記憶體屬於計算機稀缺資源,不能隨便浪費,

設計模式 模式

info 如果能 實例化 應用 技術 一個 對象存儲 數量 col (一) 享元模式   享元模式 : 運用共享技術有效地支持大量細粒度的對象    (二)內部狀態和外部狀態   在享元對象內部並且不會隨環境改變而改變的共享部分,可以稱為是享元對象的內部狀態,而隨環

設計模式模式

享元模式定義 享元模式(Flyweight Pattern)是池技術的重要實現方式,使用共享物件可有效地支援大量的細粒度的物件。 通用類圖 具體實現 當應用程式中存在大量的物件時,程式的效能會有所下降,而且可能會造成記憶體溢位。這時除了增加硬體資源或者借用

每天一個設計模式模式

作者按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前採用javascript和python兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式 :) 個人技術部落格-godbmw.com 歡迎來玩! 每週至少 1 篇原創技術分享,還有開源教程(webpack

23種設計模式模式

享元模式的定義 定義: 使用共享物件可有效的支援大量的細粒度的物件 通俗的說, 就是將類的通用屬性抽出來,建立物件池,以達到限制物件數量的效果 上面定義中要求細粒度物件, 那麼不可避免的使得物件數量多且性質相近, 我們將這些物件的資訊分為兩個部分: 內部狀態和外部狀態 內部狀態是物件可以共享出來

設計模式模式(結構型)

程序 aid 共享 對象 ron map 內部 系統 抽象 模式定義 享元模式(Flyweight Pattern)就是通過共享技術實現大量細粒度對象的復用。享元模式是通過細粒度對象的共享,所以也可以說享元模式是一種輕量級模式。按照Gof模式分類,享元模式屬於對象結構型模式

C#--設計模式模式

這幾天專案比較忙,感覺已經隔了半個世紀沒來園裡轉了,接著上次的設計模式來繼續說吧,這會來敘說一下享元模式,首先應用場景:就是在  我們需要重複使用某個物件的時候,如果我們重複地使用new建立這個物件的話,這樣我們在記憶體就需要多次地去申請記憶體空間了,這樣可能會出現記憶

c#設計模式模式

//類似單例模式加上工廠模式,避免大量建立物件帶來的記憶體消耗 using System; using System.Collections; public abstract class cha

java設計模式模式Flyweight

package com.javapatterns.flyweight.simple; public class Client { private static FlyweightFactory factory; static public void main(String[] args) { fact