<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    I want to fly higher
    programming Explorer
    posts - 114,comments - 263,trackbacks - 0
        所謂享元模式,說在一個系統中如果有多個相同的對象,那么只共享一份就可以了,不必每個都去實例化一個對象。在該模式中,包括抽象的享元,具體的享元,享元工廠以及客戶端。其中抽象的享元為公共接口或抽象類,具體的享元實現抽象享元角色所規定的接口,享元工廠負責創建和管理享元角色。
        下面寫了一個程序實現享元模式:包括抽象享元角色Person.java,兩個具體享元角色OldFlyweight.javaYoungFlyweight.java,享元工廠FlyweightFactory.java,最后是一個客戶端測試類ClientTest_Flyweight.java。

    Person.java:
     1package com.landon.trainjava.oop;
     2/**
     3 * 一個普通的抽象類,人
     4 * @author landon
     5 *
     6 */

     7public abstract class Person {
     8 /**
     9  * 為了享元模式中的方便一些,沒有加入private修飾符
    10  * 另外為了另一個包下的使用,用protectd修飾
    11  */

    12  protected String personName;
    13  protected int personAge;
    14 
    15 //右鍵Source->Generate Getters and Setters
    16 public String getPersonName() {
    17  return personName;
    18 }

    19
    20 public void setPersonName(String personName) {
    21  this.personName = personName;
    22 }

    23
    24 public int getPersonAge() {
    25  return personAge;
    26 }

    27
    28 public void setPersonAge(int personAge) {
    29  this.personAge = personAge;
    30 }

    31
    32 /**
    33  * 抽象方法
    34  */

    35 public abstract void sayHello();
    36
    37}

    38
    39


    OldFlyweight.java:

     

     1package com.landon.trainjava.designpattern;
     2
     3import com.landon.trainjava.oop.Person;
     4
     5/**
     6 * 具體的一個享元,繼承自Person
     7 * @author landon
     8 *
     9 */

    10public class OldFlyweight extends Person{
    11
    12 public OldFlyweight(int age)
    13 {
    14  this.personAge = age;
    15 }

    16 public void sayHello()
    17 {
    18  System.out.println("Hello,I'm the young!");
    19 }

    20}

    21
    22


    YoungFlyweight.java:

     

     

     1package com.landon.trainjava.designpattern;
     2
     3import com.landon.trainjava.oop.Person;
     4
     5/**
     6 * 具體的一個享元,繼承自Person
     7 * @author landon
     8 *
     9 */

    10public class YoungFlyweight extends Person{
    11 
    12 public YoungFlyweight(int age)
    13 {
    14  this.personAge = age;
    15 }

    16 
    17 public void sayHello()
    18 {
    19  System.out.println("Hello,I'm the old");
    20 }

    21}

    22
    23


    FlyweightFactory.java:

     1package com.landon.trainjava.designpattern;
     2import java.util.*;
     3
     4import com.landon.trainjava.oop.Person;
     5/**
     6 * 享元工廠
     7 * @author landon
     8 *
     9 */

    10
    11public class FlyweightFactory {
    12 //這里用Hashtable,當然也可以用ArrayList等。
    13 private Hashtable agedPersons = new Hashtable();
    14 
    15 /**
    16  * 創建和管理享元
    17  * 如果沒有創建具體享元,則創建。
    18  * 已創建,則直接獲取
    19  * @param age 年齡
    20  * @return 抽象享元
    21  */

    22 public Person getFlyweight(int age)
    23 {
    24  Person person = (Person)agedPersons.get(age);
    25  
    26  if(person  != null)
    27  {
    28   if(age == person.getPersonAge())
    29   {
    30    //輸出信息方便查看
    31    System.out.println("person-" + age + "被直接獲取");
    32   }

    33  }

    34  
    35  if(person == null)
    36  {
    37   switch (age) {
    38   case 25:
    39    person = new YoungFlyweight(age);
    40    break;
    41   case 80:
    42    person = new OldFlyweight(age);
    43   default:
    44    break;
    45   }

    46   
    47   //輸出信息方便查看
    48   System.out.println("person-" + age + "新被創建");
    49   
    50   agedPersons.put(age, person);
    51  }

    52  
    53  return person;
    54 }

    55
    56}

    57
    58


    ClientTest_Flyweight.java:

     

     1package com.landon.trainjava.designpattern;
     2
     3import com.landon.trainjava.oop.Person;
     4
     5/**
     6 * 享元模式中的客戶端角色
     7 * @author landon
     8 *
     9 */

    10public class ClientTest_Flyweight {
    11 public static void main(String []args)
    12 {
    13  FlyweightFactory flyweightFactory = new FlyweightFactory();
    14  
    15  //第一次測試,應該是直接創建
    16  Person oldFlyweight1 = flyweightFactory.getFlyweight(80);
    17  Person youngFlyweight1 = flyweightFactory.getFlyweight(25);
    18  
    19  System.out.println(oldFlyweight1.getPersonAge());
    20  System.out.println(youngFlyweight1.getPersonAge());
    21  
    22  //第二次測試,應該是直接獲取
    23  Person oldFlyweight2 = flyweightFactory.getFlyweight(80);
    24  Person youngFlyweight2 = flyweightFactory.getFlyweight(25);
    25  
    26  System.out.println(oldFlyweight2.getPersonAge());
    27  System.out.println(youngFlyweight2.getPersonAge());
    28  
    29 }

    30
    31}

    32
    33


        下面是程序運行截圖:


        可以看到,第一次使用的時候是直接創建,以后再用到該對象的時候則是直接獲取該對象。這就是享元模式的好處。

    posted on 2010-07-07 21:20 landon 閱讀(1730) 評論(5)  編輯  收藏 所屬分類: Program

    FeedBack:
    # re: 學習設計模式之享元模式
    2010-07-10 17:38 | zhlwish
    不錯的文章,挺好  回復  更多評論
      
    # re: 學習設計模式之享元模式
    2010-07-10 18:20 | landonlv
    哈哈,謝謝。大家共同進步~@zhlwish
      回復  更多評論
      
    # re: 學習設計模式之享元模式demo
    2012-04-23 13:49 | 娃娃
    寫的通俗易懂!支持一下,希望可以看到更多好文章!  回復  更多評論
      
    # re: 學習設計模式之享元模式demo
    2012-05-16 10:35 | landon
    嗯,謝謝朋友。其實這是很早的時候寫的,寫的很粗糙,以后會重寫設計模式相關的。@娃娃
      回復  更多評論
      
    # re: 學習設計模式之享元模式demo
    2012-10-04 14:22 | Lucker
    Person Name 這個變量沒有說明。
    還有就是flyweight的好處,并且在什么情況下使用,這里并沒有說明。  回復  更多評論
      
    主站蜘蛛池模板: 久久综合亚洲色一区二区三区| 毛片无码免费无码播放| 亚洲不卡在线观看| 亚洲欧洲无码AV电影在线观看| 成在线人永久免费视频播放| 18禁免费无码无遮挡不卡网站| 久久国产精品免费视频| 日韩在线观看视频免费| 国产精品亚洲专区无码WEB| 亚洲乱码一二三四五六区| 久久亚洲中文字幕精品有坂深雪| 久久亚洲中文字幕精品一区| 国产a不卡片精品免费观看| 搡女人真爽免费视频大全| 狼群影院在线观看免费观看直播 | 蜜桃成人无码区免费视频网站| 国产免费播放一区二区| 免费人成网上在线观看| 日韩色日韩视频亚洲网站 | 四虎影院在线免费播放| 无码日韩人妻av一区免费| 日本最新免费网站| 亚洲视频在线免费播放| 99久在线国内在线播放免费观看| 免费黄网站在线看| 男人的天堂网免费网站 | 91亚洲自偷手机在线观看| 久久久久久亚洲精品| 亚洲av无码乱码国产精品fc2| 亚洲日韩欧洲乱码AV夜夜摸| 亚洲国产综合无码一区| 亚洲国产精品无码专区在线观看| 国产亚洲免费的视频看| 亚洲AV无码第一区二区三区| 久久精品国产亚洲av麻豆| 亚洲国产综合专区在线电影| 亚洲高清无在码在线无弹窗| 亚洲人成免费网站| 亚洲人片在线观看天堂无码| 久久精品国产亚洲av品善| 特级毛片在线大全免费播放|