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

原創做品,能夠轉載,可是請標註出處地址:http://www.cnblogs.com/V1haoge/p/6542449.htmlhtml

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

  享元模式有點相似於單例模式,都是隻生成一個對象來被共享使用。這裏有個問題,那就是對共享對象的修改,爲了不出現這種狀況,咱們將這些對象的公共部分,或者說是不變化的部分抽取出來造成一個對象。這個對象就能夠避免到修改的問題。設計模式

  享元的目的是爲了減小不會要額內存消耗,將多個對同一對象的訪問集中起來,沒必要爲每一個訪問者建立一個單獨的對象,以此來下降內存的消耗。ide

  下面咱們來看一個簡單的例子:測試

建築接口:JianZhuthis

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

體育館實現類:TiYuGuanspa

 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 }

執行結果:code

該體育館被使用來召開奧運會  運動爲:足球  形狀爲:圓形  名稱爲:中國體育館
對象池中對象數量爲: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保存的是字符串常量池中的同一個字符串地址。這就相似於咱們今天所講述的享元模式,字符串一旦定義以後就能夠被共享使用,由於他們是不可改變的,同時被多處調用也不會存在任何隱患。

  享元模式使用的場景:

    當咱們項目中建立不少對象,並且這些對象存在許多相同模塊,這時,咱們能夠將這些相同的模塊提取出來採用享元模式生成單一對象,再使用這個對象與以前的諸多對象進行配合使用,這樣無疑會節省不少空間。

 


同系列文章:

相關文章
相關標籤/搜索