Java設計模式之《享元模式》及應用場景


原創作品,可以轉載,但是請標注出處地址:http://www.cnblogs.com/V1haoge/p/6542449.html

  享元模式:“享”就是分享之意,指一物被眾人共享,而這也正是該模式的終旨所在。

  享元模式有點類似於單例模式,都是只生成一個對象來被共享使用。這里有個問題,那就是對共享對象的修改,為了避免出現這種情況,我們將這些對象的公共部分,或者說是不變化的部分抽取出來形成一個對象。這個對象就可以避免到修改的問題。

  享元的目的是為了減少不會要額內存消耗,將多個對同一對象的訪問集中起來,不必為每個訪問者創建一個單獨的對象,以此來降低內存的消耗。

  下面我們來看一個簡單的例子:

建築接口:JianZhu

1 public interface Jianzhu {
2     void use();
3 }

體育館實現類:TiYuGuan

 1 public class TiYuGuan implements Jianzhu {
 2     private String name;
 3     private String shape;
 4     private String yundong;
 5     public TiYuGuan(String yundong){
 6         this.setYundong(yundong);
 7     }
 8     public String getName() {
 9         return name;
10     }
11     public void setName(String name) {
12         this.name = name;
13     }
14     public String getShape() {
15         return shape;
16     }
17     public void setShape(String shape) {
18         this.shape = shape;
19     }
20     public String getYundong() {
21         return yundong;
22     }
23     public void setYundong(String yundong) {
24         this.yundong = yundong;
25     }
26     @Override
27     public void use() {
28         System.out.println("該體育館被使用來召開奧運會" + "  運動為:"+ yundong+"  形狀為:"+shape+ "  名稱為:"+name);
29     }
30 }

建築工廠類:JianZhuFactory

 1 import java.util.*;
 2 
 3 public class JianZhuFactory {
 4     private static final Map<String,TiYuGuan> tygs = new HashMap<String,TiYuGuan>();
 5     public static TiYuGuan getTyg(String yundong){
 6         TiYuGuan tyg = tygs.get(yundong);
 7         if(tyg == null){
 8             tyg = new TiYuGuan(yundong);
 9             tygs.put(yundong,tyg);
10         }
11         return tyg;
12     }
13     public static int getSize(){
14         return tygs.size();
15     }
16 }

測試類:Clienter

 1 public class Clienter {
 2     public static void main(String[] args) {
 3         String yundong ="足球";
 4         for(int i = 1;i <= 5;i++){
 5             TiYuGuan tyg = JianZhuFactory.getTyg(yundong);
 6             tyg.setName("中國體育館");
 7             tyg.setShape("圓形");
 8             tyg.use();
 9             System.out.println("對象池中對象數量為:"+JianZhuFactory.getSize());
10         }
11     }
12 }

執行結果:

該體育館被使用來召開奧運會  運動為:足球  形狀為:圓形  名稱為:中國體育館
對象池中對象數量為:1
該體育館被使用來召開奧運會  運動為:足球  形狀為:圓形  名稱為:中國體育館
對象池中對象數量為:1
該體育館被使用來召開奧運會  運動為:足球  形狀為:圓形  名稱為:中國體育館
對象池中對象數量為:1
該體育館被使用來召開奧運會  運動為:足球  形狀為:圓形  名稱為:中國體育館
對象池中對象數量為:1
該體育館被使用來召開奧運會  運動為:足球  形狀為:圓形  名稱為:中國體育館
對象池中對象數量為:1

  如上示例中,使用工廠模式進行配合,創建對象池,測試類中的循環,你可以想象成為要舉行5場比賽,每場比賽的場地就是體育館

  通過執行結果可以看出,在這個對象池(HashMap)中,一直都只有一個對象存在,第一次使用的時候創建對象,之后的每次調用都用的是那個對象,不會再重新創建。

  其實在Java中就存在這種類型的實例:String。

  Java中將String類定義為final(不可改變的),JVM中字符串一般保存在字符串常量池中,這個字符串常量池在jdk 6.0以前是位於常量池中,位於永久代,而在JDK 7.0中,JVM將其從永久代拿出來放置於堆中。

  我們使用如下代碼定義的兩個字符串指向的其實是同一個字符串常量池中的字符串值。

1 String s1 = "abc";
2 String s2 = "abc";

  如果我們以s1==s2進行比較的話所得結果為:true,因為s1和s2保存的是字符串常量池中的同一個字符串地址。這就類似於我們今天所講述的享元模式,字符串一旦定義之后就可以被共享使用,因為他們是不可改變的,同時被多處調用也不會存在任何隱患。

  享元模式使用的場景:

    當我們項目中創建很多對象,而且這些對象存在許多相同模塊,這時,我們可以將這些相同的模塊提取出來采用享元模式生成單一對象,再使用這個對象與之前的諸多對象進行配合使用,這樣無疑會節省很多空間。

 


同系列文章:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM