国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java設計模式之結構型-享元模式(UML類圖+案例分析)

這篇具有很好參考價值的文章主要介紹了Java設計模式之結構型-享元模式(UML類圖+案例分析)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

一、基本概念

二、UML類圖

三、角色設計

四、案例分析

4.1、基本實現(xiàn)

4.2、游戲角色

五、總結


一、基本概念

享元模式是一種結構型設計模式,主要用于減少創(chuàng)建大量相似對象所占用的內(nèi)存,它通過共享技術來有效支持大量細粒度的對象。

二、UML類圖

Java設計模式之結構型-享元模式(UML類圖+案例分析),Java,設計模式,java,享元模式,設計模式

三、角色設計

角色 描述
抽象享元角色 定義出對象的外部狀態(tài)和內(nèi)部狀態(tài)的接口或屬性。
具體享元角色 實現(xiàn)抽象享元角色,定義內(nèi)部狀態(tài),可以保存共享對象的狀態(tài)
享元工廠角色 負責創(chuàng)建和管理享元對象
客戶端角色 存儲外部狀態(tài),在需要時通過享元工廠獲取享元對象

四、案例分析

享元模式中的享元對象可以認為是一種可復用的組件。比如在游戲中,有許多類型相同的敵人,這時就可以使用享元模式。

1、我們會創(chuàng)建一個享元工廠類,這個類就像一個存放享元對象的倉庫??蛻舳诵枰獙ο髸r,就來這個工廠類這里取。

2、工廠類存放的是享元對象。享元對象有兩種狀態(tài):內(nèi)部狀態(tài)與外部狀態(tài)。

內(nèi)部狀態(tài)是對象共享的部分,不會改變,比如敵人的形狀、顏色等。

外部狀態(tài)是對象依賴的可變部分,比如敵人的位置。

3、當客戶端需要一個享元對象時,會先從工廠請求。?

如果工廠里已有該對象,就直接返回已有實例,復用該對象。?

如果沒有,則創(chuàng)建新實例,并存入工廠后返回。

4、客戶端拿到對象后,將外部狀態(tài)設置給該對象,然后顯示。

5、對象使用完后并不銷毀,而是返還給工廠繼續(xù)復用。這樣通過管理可復用的享元對象,就可以大量減少對象的創(chuàng)建,節(jié)省內(nèi)存空間,提高性能。

本篇共舉了2個簡單的小案例進行分析,可以更好的去理解這個設計模式。

4.1、基本實現(xiàn)

首先定義一個享元接口并聲明了一個操作方法:

interface Flyweight {

    void operate(String extrinsicState);

}

創(chuàng)建具體的享元類,實現(xiàn)享元接口,并包含內(nèi)部狀態(tài):?

class ConcreteFlyweight implements Flyweight {
    private String intrinsicState;
 
    public ConcreteFlyweight(String intrinsicState) {
        this.intrinsicState = intrinsicState;
    }
 
    public void operate(String extrinsicState) {
        System.out.println("內(nèi)部狀態(tài): " + intrinsicState);
        System.out.println("外部狀態(tài): " + extrinsicState);
        // 執(zhí)行享元操作
    }
}

創(chuàng)建享元工廠類,用于管理和共享享元對象:?

import java.util.HashMap;
import java.util.Map;
 
class FlyweightFactory {
    private Map<String, Flyweight> flyweights;
 
    public FlyweightFactory() {
        flyweights = new HashMap<>();
    }
 
    public Flyweight getFlyweight(String intrinsicState) {
        if (flyweights.containsKey(intrinsicState)) {
            return flyweights.get(intrinsicState);
        } else {
            Flyweight flyweight = new ConcreteFlyweight(intrinsicState);
            flyweights.put(intrinsicState, flyweight);
            return flyweight;
        }
    }
}

在客戶端中使用享元工廠類來獲取和使用享元對象:

public class Client {
    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();
 
        // 獲取或創(chuàng)建享元對象
        Flyweight flyweight1 = factory.getFlyweight("SharedState");
        Flyweight flyweight2 = factory.getFlyweight("SharedState");
 
        // 使用享元對象
        flyweight1.operate("ExtrinsicState1");
        flyweight2.operate("ExtrinsicState2");
    }
}

運行結果如下:

Java設計模式之結構型-享元模式(UML類圖+案例分析),Java,設計模式,java,享元模式,設計模式

4.2、游戲角色

我們舉一個形象一些的例子,游戲中需要顯示大量的相似的敵人角色,這時就可以使用享元模式復用對象以減少內(nèi)存開銷。

定義角色(抽象享元角色)接口:

public interface GameRole {

    void display(String name);
}

具體角色(具體享元角色)實現(xiàn):

public class Enemy implements GameRole {

    private String type;

    public Enemy(String type){
        this.type = type;
    }

    @Override
    public void display(String attackType) {
        System.out.println(type+"敵人已啟用!"+"攻擊方式:"+attackType);
    }
}

角色工廠(享元工廠角色)實現(xiàn):

import java.util.HashMap;
import java.util.Map;

public class RoleFactory {

  private Map<String, GameRole> pool;

  public RoleFactory() {
    pool = new HashMap<>();
  }

  GameRole getRole(String type) {
    if(!pool.containsKey(type)) {
      pool.put(type, new Enemy(type)); 
    }
    return pool.get(type);
  }
}

客戶端:

public class Client {

    public static void main(String[] args) {
        RoleFactory factory = new RoleFactory();
        GameRole a = factory.getRole("A");
        GameRole b = factory.getRole("B");
        a.display("boom");
        b.display("fly");

    }
}

運行結果如下:

Java設計模式之結構型-享元模式(UML類圖+案例分析),Java,設計模式,java,享元模式,設計模式

五、總結

優(yōu)點:

1、減少內(nèi)存占用,降低系統(tǒng)資源消耗。

2、提高系統(tǒng)性能。

缺點:

1、增加了系統(tǒng)的復雜度;

2、區(qū)分內(nèi)部狀態(tài)和外部狀態(tài)可能會很復雜;

3、享元模式使得系統(tǒng)難以維護和擴展。

應用場景:

1、一個應用程序使用大量的相似對象。

2、對象的大多數(shù)狀態(tài)都可以外部化。

3、在內(nèi)存是關鍵資源的系統(tǒng)中。

4、系統(tǒng)要求消除大量相似類的重復對象。

例如游戲設計中復用相同的角色對象、網(wǎng)站設計的外觀樣式、多線程池中的線程對象等都適合使用享元模式。

符合的設計原則:

1、單一職責原則(Single Responsibility Principle)

享元模式分離了內(nèi)部狀態(tài)和外部狀態(tài)。

2、開閉原則(Open Close Principle)

新增享元對象不影響其他對象。

3、組合復用原則(Composite Reuse Principle)

享元對象可以被組合、聚合。文章來源地址http://www.zghlxwxcb.cn/news/detail-570765.html

到了這里,關于Java設計模式之結構型-享元模式(UML類圖+案例分析)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 設計模式之享元模式【結構型模式】

    設計模式之享元模式【結構型模式】

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 學習的最大理由是想擺脫平庸,早一天就多一份人生的精彩;遲一天就多一天平庸的困擾。各位小伙伴,如果您: 想系統(tǒng)/深入學習某技術知識點… 一個人摸索學習很難堅持,想組團高效學習… 想寫博

    2024年01月25日
    瀏覽(27)
  • [設計模式 Go實現(xiàn)] 結構型~享元模式

    享元模式從對象中剝離出不發(fā)生改變且多個實例需要的重復數(shù)據(jù),獨立出一個享元,使多個對象共享,從而節(jié)省內(nèi)存以及減少對象數(shù)量。 flyweight.go flyweight_test.go

    2024年01月16日
    瀏覽(30)
  • 設計模式(十二):結構型之享元模式

    設計模式(十二):結構型之享元模式

    設計模式系列文章 設計模式(一):創(chuàng)建型之單例模式 設計模式(二、三):創(chuàng)建型之工廠方法和抽象工廠模式 設計模式(四):創(chuàng)建型之原型模式 設計模式(五):創(chuàng)建型之建造者模式 設計模式(六):結構型之代理模式 設計模式(七):結構型之適配器模式 設計模式(八):結構型之裝

    2024年02月08日
    瀏覽(24)
  • 笨蛋學設計模式結構型模式-享元模式【13】

    7.7.1概念 ? 享元模式是通過共享對象減少內(nèi)存使用,來提高程序性能。在此模式中,分為內(nèi)部狀態(tài)和外部狀態(tài),其中相似的對象被存儲在享元對象內(nèi)部,并對于所有享元對象都是相同的,且狀態(tài)通常是不變的。只在需要時內(nèi)部共享,而不是每次創(chuàng)建新的對象。而外部狀態(tài)是享

    2024年01月23日
    瀏覽(29)
  • 【結構型設計模式】C#設計模式之享元模式

    享元模式(Flyweight Pattern)是一種結構型設計模式,旨在通過盡可能共享對象來減少內(nèi)存使用和提高性能。它將對象分為兩種類型:內(nèi)部狀態(tài)(Intrinsic State)和外部狀態(tài)(Extrinsic State)。內(nèi)部狀態(tài)是可以共享的,而外部狀態(tài)是獨立于享元對象的,并且在使用時需要注入。 使用

    2024年02月13日
    瀏覽(27)
  • 【設計模式】第13節(jié):結構型模式之“享元模式”

    【設計模式】第13節(jié):結構型模式之“享元模式”

    所謂“享元”,顧名思義就是被共享的單元。享元模式的意圖是復用對象,節(jié)省內(nèi)存,前提是享元對象是不可變對象。 實現(xiàn):通過工廠模式,在工廠類中,通過一個Map或者List來緩存已經(jīng)創(chuàng)建好的享元對象,以達到復用的目的。把實例的共享狀態(tài)和不共享狀態(tài)分開。 以下是畫

    2024年02月08日
    瀏覽(16)
  • 【Java 設計模式】結構型之代理模式

    代理模式(Proxy Pattern)是一種結構型設計模式, 它允許通過一個代理對象控制對其他對象的訪問 。代理模式在訪問對象時引入了一定程度的間接性,使得可以在訪問對象前后進行一些額外的操作。在本文中,我們將深入研究Java中代理模式的定義、結構、使用場景以及如何在

    2024年01月21日
    瀏覽(23)
  • Java學習——設計模式——結構型模式2

    Java學習——設計模式——結構型模式2

    結構型模式主要涉及如何組合各種對象以便獲得更好、更靈活的結構。雖然面向對象的繼承機制提供了最基本的子類擴展父類的功能,但結構型模式不僅僅簡單地使用繼承,而更多地通過組合與運行期的動態(tài)組合來實現(xiàn)更靈活的功能。 包括: 1、適配器 2、橋接 3、組合 4、裝

    2024年02月03日
    瀏覽(27)
  • 【Java 設計模式】結構型之橋接模式

    【Java 設計模式】結構型之橋接模式

    橋接模式(Bridge Pattern)是一種結構型設計模式, 它將抽象部分與實現(xiàn)部分分離,使它們可以獨立變化,從而降低它們之間的耦合 。橋接模式通過將抽象部分和實現(xiàn)部分分離,使得它們可以獨立地變化,同時在它們之間建立一個橋梁。在本文中,我們將介紹 Java 中橋接模式的

    2024年01月19日
    瀏覽(23)
  • 【Java 設計模式】結構型之外觀模式

    外觀模式(Facade Pattern)是一種結構型設計模式, 它為復雜系統(tǒng)提供了一個簡化的接口,隱藏了系統(tǒng)的復雜性,使得客戶端更容易使用系統(tǒng) 。外觀模式通過創(chuàng)建一個包裝類(外觀類),將系統(tǒng)的復雜性封裝起來,對客戶端提供一個簡單的接口。在本文中,我們將深入研究Ja

    2024年01月21日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包