成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文徹底搞明白享元模式

開發 前端
通過分類,就可以采取不同的操作。在享元模式中,通過狀態是否共享這種分類方式,就可以用來節省存儲空間,并且節省空間的同時其實也可以節省對象創建的時間。

本篇講解Java設計模式中的享元模式,分為定義、模式應用前案例、結構、模式應用后案例、適用場景、模式可能存在的困惑和本質探討7個部分。

定義

享元模式指的是運用共享技術有效地支持大量細粒度的對象。

在新的分類方式中,享元模式被劃分至類的屬性相關類別中,其應對類的不同對象可以共享內部狀態(可共享的屬性)的要求。

模式應用前案例

在享元模式中,我們來看一個文本編輯器的案例。對于文本編輯器來說,可以包括添加文本、顯示文本、清空文本等操作。對于其中的文本,都有自身的文本樣式。

下面,先來看一下未使用享元模式的案例,代碼實現如下。

public class Text {//文本類

private final String content;
private final TextStyle style;

public Text(String content, TextStyle style) {
this.content = content;
this.style = style;
    }

public void display() {
        System.out.println("Text: " + this.content + ", Style: " + this.style);
    }

}

public class TextStyle {//文本樣式類
private final String font;
private final int size;
private final String color;

public TextStyle(String font, int size, String color) {
this.font = font;
this.size = size;
this.color = color;
    }

@Override
public String toString() {
return "Font: "+ this.font +", Size: "+ this.size +", Color: "+ this.color;
    }

}

public class TextEditor {// 文本編輯器類
    List<Text> textList;

public TextEditor(){
this.textList =new ArrayList<>();
    }

// 添加文本到編輯器中
public void addText(Text text){
this.textList.add(text);
    }

// 顯示所有文本內容和樣式信息
public void displayAllTexts(){
for(Text text : this.textList){
            text.display();
        }
    }

// 清空所有文本內容
public void clearAllTexts(){
this.textList.clear();
        System.out.println("All texts cleared.");
    }

}

調用方代碼如下。

public class Client {//調用方代碼
public static void main(String[] args) {
// 創建文本編輯器對象
        TextEditor textEditor = new TextEditor();

// 創建兩個相同樣式(Arial 12 Black)的文字片段并添加到編輯器中
        TextStyle textStyle1 = new TextStyle("Arial", 12, "Black");
        Text text1 = new Text("Hello World", textStyle1);

        TextStyle textStyle2 = new TextStyle("Arial", 12, "Black");
        Text text2 = new Text("Welcome to the world of programming!", textStyle2);

        textEditor.addText(text1);
        textEditor.addText(text2);

// 顯示所有文本內容和樣式信息
        System.out.println("Displaying all texts:");
        textEditor.displayAllTexts();

// 清空所有文本內容
        System.out.println("\nClearing all texts:");
        textEditor.clearAllTexts();

    }
}

在上述代碼中,文本樣式類是文本類中的屬性。對于每一個文本,即便文本樣式相同,代碼中也會創建新的文本樣式類。

直觀感覺上,就會覺得此處是否可以復用呢?對于此種場景,就適合使用享元模式來進行處理。

結構

享元模式的示例代碼實現如下。

public interface Flyweight {
void Operation(int extrinsicstate);
}

public class ConereteFlyweight implements Flyweight {

@Override
public void Operation(int extrinsicstate) {
        System.out.println("共享的具體Flyweight:" +extrinsicstate);
    }

}

public class UnsharedConereteFlyweight implements Flyweight{
@Override
public void Operation(int extrinsicstate) {
        System.out.println("不共享的具體Flyweight:" +extrinsicstate);
    }
}

public class FlyweightFactory {
private static final Map<String, Flyweight> flyweights = new HashMap<>();

public FlyweightFactory() {
        flyweights.put("A", new ConereteFlyweight());
        flyweights.put("B", new ConereteFlyweight());
        flyweights.put("C", new ConereteFlyweight());
    }

public Flyweight getFlyweight(String key) {
return flyweights.get(key);
    }

}

public class Client {
public static void main(String[] args) {
int extrinsicstate = 1;
       FlyweightFactory factory = new FlyweightFactory();
       Flyweight fa = factory.getFlyweight("A");
       fa.Operation(extrinsicstate);

       Flyweight fb = factory.getFlyweight("B");
       fb.Operation(extrinsicstate);

       Flyweight fc = factory.getFlyweight("C");
       fc.Operation(extrinsicstate);

       UnsharedConereteFlyweight uf = new UnsharedConereteFlyweight();
       uf.Operation(extrinsicstate);
    }

}

可以發現,在享元模式下,先將類的屬性分成兩種類別,一類是多個對象可以共享的狀態,另一類是多個對象私有的狀態。

然后,通過接口或繼承實現的一個類家族實現上述兩種類別,即圖中的Flyweight及具體實現類。

此外,提供一個FlyweightFactory支撐類,這個類的作用就是負責創建一些包含共享狀態的對象,然后緩存起來。

當調用方需要用到時,就可以通過FlyweightFactory來獲取到共享的狀態。同時,那些不能共享的狀態(或屬性),也可以通過UnsharedConcreteFlyweight類來創建。

模式應用后案例

上述文本編輯器的案例,在使用享元模式后的代碼實現如下。

public class Text {//文本類

private final String content;
private final TextStyle style;

public Text(String content, TextStyle style) {
this.content = content;
this.style = style;
    }

public void display() {
        System.out.println("Text: " + this.content + ", Style: " + this.style);
    }

}

public class TextStyle {//文本樣式類
private final String font;
private final int size;
private final String color;

public TextStyle(String font, int size, String color) {
this.font = font;
this.size = size;
this.color = color;
    }

@Override
public String toString() {
return "Font: "+ this.font +", Size: "+ this.size +", Color: "+ this.color;
    }

}

文本Text類中的TextStyle屬性可以共享,content屬性不能共享。因此,可以創建一個TextFactory類來共享TextStyle。

public class TextFactory {//享元工廠類

private static final HashMap<String, TextStyle> stylesMap = new HashMap<>();

public static TextStyle getTextStyle(String font,int size,String color){
        stylesMap.putIfAbsent(font+size+color,new TextStyle(font,size,color));
return stylesMap.get(font+size+color);
    }
}

享元工廠類有了之后,文本編輯器類代碼如下。

public class TextEditor {//文本編輯器類
    List<Text> textList;

public TextEditor(){
this.textList =new ArrayList<>();
    }

// 添加文本到編輯器中
public void addText(String content, String font, int size, String color){
        TextStyle sharedStyle = TextFactory.getTextStyle(font, size, color);
this.textList.add(new Text(content, sharedStyle));
    }

// 顯示所有文本內容和樣式信息
public void displayAllTexts(){
for(Text text : this.textList){
            text.display();
        }
    }

// 清空所有文本內容
public void clearAllTexts(){
this.textList.clear();
        System.out.println("All texts cleared.");
    }
}

調用方代碼如下。

public class Client {//調用方代碼

public static void main(String[] args) {

// 創建文本編輯器對象
        TextEditor editor = new TextEditor();

// 使用編輯器添加相同樣式(Arial 12 Black)的文字片段
        editor.addText("Hello World", "Arial", 12, "Black");
        editor.addText("Welcome to the world of programming!", "Arial", 12,"Black");

// 顯示所有文本內容和樣式信息
        System.out.println("Displaying all texts:");
        editor.displayAllTexts();

    }

}

上述代碼中,在需要用到TextStyle的地方,通過享元工廠類獲取,而不是直接通過new方式創建,這樣所有文本類都可以共享一個TextStyle對象,這就是享元模式發揮作用的地方。

適用場景

當程序中需要創建大量對象,并且這些對象共享一部分內部狀態,為了節省內存空間,就可以考慮使用享元模式。

比如,在Java語言中,Integer、String等類,由于不同對象可能共享相同的字面量,因此其內部都應用了享元模式。

模式可能存在的困惑

困惑1:享元模式中,經常提到的內部狀態與外部狀態,是什么含義?

一個類中可以包含多個屬性,其中可以被多個對象共享的狀態或屬性成為“內部狀態”,而每個對象獨有的屬性或狀態則成為“外部狀態”。

困惑2:結構圖中的Client與FlyweightFactory類有交互,但是案例中的TextEditor類中有使用TextFactory類,Client類并沒有使用?

在應用設計模式時,有時候不能按照設計模式標準結構來生搬硬套。關鍵在于理解設計模式的核心思想之后能夠靈活運用。

案例中的TextEditor其實相當于結構中的Client。Text類相當于Flyweight類,而TextStyle類Text類中的共享狀態。案例的結構與結構中的結構并不完全相同,但是對于享元模式中的共享思想運用是一致的。

困惑3:享元模式相當于是為了對象的復用,以節省存儲空間。在日常編程中,像對象池、線程池、連接池等技術也是為了對象的復用,那么區別在哪里呢?

主要區別在于時間觀上的不同。對于對象池、線程池、連接池等技術來說,在同一時刻,一個共享的對象只能用于一個調用方。只有該對象使用完畢重新放在池子之后,其他調用方才能使用。

而對于享元模式來說,同一時刻,可以被許多調用方同時共享復用,不需要在時間上錯開使用。

本質

享元模式的本質是對類中屬性更細粒度的控制。在享元模式中,是通過狀態是否共享來分類的。

通過分類,就可以采取不同的操作。在享元模式中,通過狀態是否共享這種分類方式,就可以用來節省存儲空間,并且節省空間的同時其實也可以節省對象創建的時間。

這里值得提醒一下,時間和空間并不是在任何場景下都是一組矛盾關系,如空間增加可以減少時間,空間變少時間就會加長等。在享元模式中,是對象復雜度的降低導致了空間和時間都在某種程度上都有所減少。

當然,對于類中屬性也可能有其他分類方式,如本質屬性和偶然屬性的劃分等。享元模式僅僅是處理這些分類方式中的一種特例。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2024-05-09 09:09:19

組合模式對象

2024-05-13 10:45:25

中介模式面向對象數量

2024-05-10 08:43:04

外觀模式接口系統

2024-05-11 14:18:44

迭代器模式業務

2024-05-15 17:41:37

備忘錄模式多線程

2019-08-27 14:46:59

ElasticSearES數據庫

2024-02-27 11:59:12

享元模式對象

2020-07-10 08:03:35

DNS網絡ARPAne

2023-05-29 08:45:45

Java注解數據形式

2019-09-09 11:02:17

Nginx進程模型

2023-03-13 08:12:37

Golang編程路徑問題

2021-05-06 08:03:07

IPIP網絡模式calicok8s

2023-11-06 09:06:54

分布式一致性數據

2021-07-08 10:08:03

DvaJS前端Dva

2020-12-07 06:19:50

監控前端用戶

2022-05-30 10:37:35

分布式事務反向補償

2021-06-30 08:45:02

內存管理面試

2023-10-27 08:15:45

2020-03-18 14:00:47

MySQL分區數據庫

2022-06-07 10:13:22

前端沙箱對象
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91爱啪啪 | 日韩在线不卡 | 午夜网址| 精品欧美一区二区久久久伦 | 超碰精品在线观看 | www.亚洲一区 | 久久综合九九 | av中文字幕网站 | 国产精品精品视频一区二区三区 | 操操日| 羞羞的视频在线 | 国产成人综合在线 | www.久久精品视频 | 久久综合伊人一区二区三 | 日日夜夜操天天干 | 99久久久久久 | 婷婷丁香综合网 | 中文字幕日韩欧美 | 午夜丰满少妇一级毛片 | 久久久久久亚洲欧洲 | 久久久久国产精品午夜一区 | 日韩精品成人av | 中文字幕一区二区三区四区五区 | 欧美2区| 亚洲精品第一页 | 欧美一级网站 | av午夜激情 | 亚洲伊人精品酒店 | 97超碰站| 国产视频黄色 | www.操com | 天堂一区在线 | 成年视频在线观看福利资源 | 天天操天天拍 | 男女精品久久 | 亚洲成人免费视频在线 | 成人国产精品入口免费视频 | 国产成人99久久亚洲综合精品 | 青青草原精品99久久精品66 | 国产精品一区二区三区在线 | 日韩精品在线免费观看 |