設計模式之不變模式(Immutable Pattern)分析

quguiliang 13年前發布 | 1K 次閱讀

不變模式(immutable pattern)</SPAN>

一個類的內部狀態創建后,在整個生命期間都不會發生變化時,就是不變類。這種使用不變類的做法叫做不變模式。

不變模式有兩種形式:一種是弱不變模式,另一種是強不變模式。

弱不變模式:</SPAN>
一個類的實例的狀態是不可變化的,但是這個類的引用的實例具有可能會變化的狀態。這樣的類符合弱不變模式的定義。要實現弱不變模式,一個類必須滿足如下條件:

    第一,對象沒有任何方法會修改對象的狀態,當對象的構造函數對對象的狀態初始化之后,對象的狀態便不再改變。

    第二,所有的屬性都應當是私有的,以防客戶端對象直接修改任何的內部狀態。

    第三,這個對象所引用的對象如果是可變對象的話,必須設法限制外界對這個對象的訪問,以防止對這些對象的修改。如果可能應該盡量在不變對象的內部來初始化。

    弱不變模式的缺點是:
一個弱不變對象引用的實例變量可以是可變對象,可能會通過外界修改父對象的狀態,這是一個顯著的缺點。可以在初始化可變對象時,先進行clone。

代碼演示:

<DIV class=dp-highlighter>

<DIV class=bar>

<DIV class=tools>Java代碼 <A title=復制代碼 onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="/misc/goto?guid=4958346284570877790"><IMG alt=復制代碼 src="/images/icon_copy.gif"></A> <A title=收藏這段代碼 onclick="code_favorites_do_favorite(this);return false;" href="/misc/goto?guid=5033824541631065302"><IMG class=star alt=收藏代碼 src="/images/icon_star.png"><IMG style="DISPLAY: none" class=spinner src="/images/spinner.gif"></A></DIV></DIV>

<OL class=dp-j>

  • /**  
  •  * @author Peter Wei  
  •  *   
  •  */  
  • public class User {   
  •   
  •     private String name;   
  •   
  •     public String getName() {   
  •         return name;   
  •     }   
  •   
  •     public void setName(String name) {   
  •         this.name = name;   
  •     }   
  •   
  • }   
  •   
  • /**  
  •  * 弱不變模式  
  •  *   
  •  * @author Peter Wei  
  •  *   
  •  */  
  • public class WeakImmutable {   
  •   
  •     // 屬性私有,滿足條件2   
  •     private int state;   
  •     // 屬性私有,滿足條件2   
  •     private User user;   
  •   
  •     private Integer age;   
  •   
  •     public WeakImmutable(int state, User user, Integer age) {   
  •         this.state = state;   
  •         this.user = user;   
  •         this.age = age;   
  •     }   
  •   
  •     public int getState() {   
  •         return this.state;   
  •     }   
  •   
  •     public User getUser() {   
  •         return this.user;   
  •     }   
  •   
  •     public Integer getAge() {   
  •         return this.age;   
  •     }   
  •   
  •     public void setState() {   
  •         // 對象沒有任何方法修改對象的狀態,滿足條件1   
  •         // do nothing.   
  •     }   
  •   
  •     public static void main(String[] args) {   
  •         int state = 0;   
  •         User u = new User();   
  •         Integer age = 100;   
  •         u.setName("yes");   
  •         WeakImmutable weak = new WeakImmutable(state, u, age);   
  •         System.out.println("原始值:" + weak.getState() + ","  
  •                 + weak.getUser().getName() + "," + weak.getAge());   
  •         // 修改引用后   
  •         state = 5;   
  •         // User由于是可變對象引用,所以有影響   
  •         u.setName("no");   
  •         age = 200;   
  •         System.out.println("修改引用后:" + weak.getState() + ","  
  •                 + weak.getUser().getName() + "," + weak.getAge());   
  •     }   
  • }  
  • </OL></DIV><PRE style="DISPLAY: none" class=java title="設計模式之不變模式(Immutable Pattern)分析" name="code" pre_index="0" source_url="
    • @author Peter Wei
    • */ public class User {

      private String name;

      public String getName() {

       return name;
      

      }

      public void setName(String name) {

       this.name = name;
      

      }

    }

    /**

     本文由用戶 quguiliang 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!