設計模式之享元模式(卷十一)
通過使用池的技術,有效減少了大量
細粒度
的物件的重複生成。
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