天天看點

23種設計模式----享元模式----結構型模式

享元模式

  • ​​1.什麼是享元模式​​
  • ​​2.享元模式的角色​​
  • ​​3.模型​​
  • ​​4.例子​​
  • ​​4.1 背景​​
  • ​​4.2 項目結構​​
  • ​​4.3 例子說明​​
  • ​​4.4 中繼資料​​
  • ​​4.5 中繼資料管理類​​
  • ​​4.6 使用者​​
  • ​​4.7 結果​​
  • ​​5.總結​​

23種設計模式

1.什麼是享元模式

要了解享元模式首先需要了解什麼是中繼資料。

中繼資料不沒有準确的範圍,或者準确的格式。隻能是相對來說。

比如對于一篇文章,中繼資料可以是章節,可以是段落,可以是語句,可以是文字,可以是筆畫,甚至可以是像素點。。

對于文章,很多文章有一些版本聲明之類的而且每一個文章的聲明都相同,那麼版本聲明的段落就是文章的一個中繼資料。。。

享元模式就是把中繼資料用完後存起來,因為是中繼資料,使用的頻率比較高,建立一個中繼資料的難度較大。儲存起來後,再次用到中繼資料時,就不用建立了,而是可以直接使用。

享元模式與原型模式的差別:

從某種意義上來說:享元模式和原型模式的原理相似。但是這兩種模式的工作的尺度不同。

享元模式的尺度比較小,更專注于本質。原型模式的尺度較大,專注于複雜對象。

舉個例子:

享元模式更多的用在字元串和字元這一層面。

原型模式更多的用在持有某個複雜頁面的對象(或者資料對象)。

2.享元模式的角色

中繼資料:根據需求定義的中繼資料

中繼資料工廠:管理中繼資料的類

使用者:使用中繼資料的類

3.模型

間接關聯

管理

關聯

使用者

中繼資料

管理者

4.例子

4.1 背景

在Java程式中,每一個字元串都是全新的對象,即使内容相同,對象也不同。

是以字元串比較需要使用equals方法來比較,而equals方法比較的也隻是對象的内容不是對象本身。

這也是Java沒有全等于的操作符 ===

當然,基本類型是可以使用運算符直接比較的。

如果一個程式大量的使用字元串,那麼Java虛拟機的動作也是非常的頻繁,需要不停的進行垃圾回收等等。。

那麼如何實作相同的字元使用相同的對象呢?

對于Java程式來說,引用遠遠的比new對象快,比new對象更劃算(節省空間等等)

4.2 項目結構

23種設計模式----享元模式----結構型模式

4.3 例子說明

例子中包含2個享元模式的使用:

使用者—語句

語句----字元

4.4 中繼資料

package flyWeight;

public class Word {

  private char c;
  
  public Word(char c){
    this.c = c;
  }
  
  public char getChar(){
    return c;
  }
  
}
      
package flyWeight;

import flyweightfactory.WordFactory;

public class Statement {

  private String message;
  
  public Statement(String message){
    this.message = message;
  }
  
  public String getMessage(){
    return message;
  }
  
  public void sayMessage(){
    for(int i = 0;i < message.length();i++){
      System.out.println(WordFactory.getInstance().getWord(message.charAt(i)).getChar());
      System.out.println(WordFactory.getInstance().getWord(message.charAt(i)));
    }
  }
  
}
      

4.5 中繼資料管理類

package flyweightfactory;

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

import flyWeight.Word;

public class WordFactory {

  private static WordFactory factory = new WordFactory();
  
  private static Map<Character, Word> map = new HashMap<Character, Word>();
  
  private WordFactory(){
    
  }
  
  public static WordFactory getInstance(){
    return factory;
  }
  
  public synchronized Word getWord(Character c){
    if(map.containsKey(c)){
      return map.get(c);
    } else {
      Word word = new Word(c);
      map.put(c, word);
      return word;
    }
  }
}
      
package flyweightfactory;

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

import flyWeight.Statement;

public class StatementFactory {

  private static StatementFactory factory = new StatementFactory();
  
  private Map<String, Statement> map = new HashMap<String, Statement>();
  
  private StatementFactory(){
    
  }
  
  public synchronized Statement getStatement(String message){
    if(map.containsKey(message)){
      return map.get(message);
    } else {
      Statement statement = new Statement(message);
      map.put(message, statement);
      return statement;
      
    }
  }
  
  public static StatementFactory getInstance(){
    return factory;
  }
  
}
      

4.6 使用者

package client;

import flyweightfactory.StatementFactory;

public class Main {

  public static void main(String[] args) {

    System.out.println("李明");
    System.out.println("李明說:"
        + StatementFactory.getInstance().getStatement("你好")
            .getMessage()
        + StatementFactory.getInstance().getStatement("你好"));
    StatementFactory.getInstance().getStatement("你好").sayMessage();
    System.out.println("小華");
    System.out.println("小華說:"
        + StatementFactory.getInstance().getStatement("你好")
            .getMessage()
        + StatementFactory.getInstance().getStatement("你好"));
    StatementFactory.getInstance().getStatement("你好").sayMessage();
    StatementFactory.getInstance().getStatement("這是長篇大論").sayMessage();
    System.out.println("一起說:"
        + StatementFactory.getInstance().getStatement("你好")
            .getMessage()
        + StatementFactory.getInstance().getStatement("你好"));
    
    System.out.println("你要長長的,好好的");
    System.out.println(StatementFactory.getInstance().getStatement("你要長長的,好好的").getMessage()+
        StatementFactory.getInstance().getStatement("你要長長的,好好的"));
    StatementFactory.getInstance().getStatement("你要長長的,好好的").sayMessage();

  }

}
      

4.7 結果

李明
李明說:你好flyWeight.Statement@e53108
你
word.Word@1f33675
好
word.Word@7c6768
小華
小華說:你好flyWeight.Statement@e53108
你
word.Word@1f33675
好
word.Word@7c6768
這
word.Word@1690726
是
word.Word@5483cd
長
word.Word@9931f5
篇
word.Word@19ee1ac
大
word.Word@1f1fba0
論
word.Word@1befab0
一起說:你好flyWeight.Statement@e53108
你要長長的,好好的
你要長長的,好好的flyWeight.Statement@13c5982
你
word.Word@1f33675
要
word.Word@1186fab
長
word.Word@9931f5
長
word.Word@9931f5
的
word.Word@14b7453
,
word.Word@c21495
好
word.Word@7c6768
好
word.Word@7c6768
的
word.Word@14b7453
      

5.總結

繼續閱讀