<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
        所謂享元模式,說在一個(gè)系統(tǒng)中如果有多個(gè)相同的對象,那么只共享一份就可以了,不必每個(gè)都去實(shí)例化一個(gè)對象。在該模式中,包括抽象的享元具體的享元享元工廠以及客戶端。其中抽象的享元為公共接口或抽象類,具體的享元實(shí)現(xiàn)抽象享元角色所規(guī)定的接口,享元工廠負(fù)責(zé)創(chuàng)建和管理享元角色。
        下面寫了一個(gè)程序?qū)崿F(xiàn)享元模式:包括抽象享元角色Person.java,兩個(gè)具體享元角色OldFlyweight.javaYoungFlyweight.java享元工廠FlyweightFactory.java,最后是一個(gè)客戶端測試類ClientTest_Flyweight.java

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

     7public abstract class Person {
     8 /**
     9  * 為了享元模式中的方便一些,沒有加入private修飾符
    10  * 另外為了另一個(gè)包下的使用,用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 * 具體的一個(gè)享元,繼承自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 * 具體的一個(gè)享元,繼承自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,當(dāng)然也可以用ArrayList等。
    13 private Hashtable agedPersons = new Hashtable();
    14 
    15 /**
    16  * 創(chuàng)建和管理享元
    17  * 如果沒有創(chuàng)建具體享元,則創(chuàng)建。
    18  * 已創(chuàng)建,則直接獲取
    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 + "新被創(chuàng)建");
    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  //第一次測試,應(yīng)該是直接創(chuàng)建
    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  //第二次測試,應(yīng)該是直接獲取
    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


        下面是程序運(yùn)行截圖:


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

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

    FeedBack:
    # re: 學(xué)習(xí)設(shè)計(jì)模式之享元模式
    2010-07-10 17:38 | zhlwish
    不錯(cuò)的文章,挺好  回復(fù)  更多評論
      
    # re: 學(xué)習(xí)設(shè)計(jì)模式之享元模式
    2010-07-10 18:20 | landonlv
    哈哈,謝謝。大家共同進(jìn)步~@zhlwish
      回復(fù)  更多評論
      
    # re: 學(xué)習(xí)設(shè)計(jì)模式之享元模式demo
    2012-04-23 13:49 | 娃娃
    寫的通俗易懂!支持一下,希望可以看到更多好文章!  回復(fù)  更多評論
      
    # re: 學(xué)習(xí)設(shè)計(jì)模式之享元模式demo
    2012-05-16 10:35 | landon
    嗯,謝謝朋友。其實(shí)這是很早的時(shí)候?qū)懙模瑢懙暮艽植冢院髸貙懺O(shè)計(jì)模式相關(guān)的。@娃娃
      回復(fù)  更多評論
      
    # re: 學(xué)習(xí)設(shè)計(jì)模式之享元模式demo
    2012-10-04 14:22 | Lucker
    Person Name 這個(gè)變量沒有說明。
    還有就是flyweight的好處,并且在什么情況下使用,這里并沒有說明。  回復(fù)  更多評論
      
    主站蜘蛛池模板: 婷婷亚洲久悠悠色悠在线播放| 免费精品国偷自产在线在线 | 亚洲午夜福利在线观看| 亚洲AV无码成人网站在线观看| 免费看的一级毛片| 亚洲第一综合天堂另类专| 亚洲资源在线视频| 真实国产乱子伦精品免费| 亚洲精品综合久久中文字幕| 日韩精品免费一级视频| 亚洲国产精品一区二区久| 成人免费无码视频在线网站| 亚洲午夜无码AV毛片久久| 亚洲人成网站18禁止久久影院| 国产一卡二卡四卡免费| 亚洲av无码精品网站| 一级片在线免费看| 亚洲av无码乱码国产精品fc2| 久久免费公开视频| 亚洲国产中文v高清在线观看| 亚洲欧洲国产综合| 国产成人精品一区二区三区免费| 老汉色老汉首页a亚洲| 成人午夜性A级毛片免费| 美女又黄又免费的视频| 国产亚洲3p无码一区二区| 三年片在线观看免费大全电影 | 亚洲香蕉免费有线视频| 永久黄网站色视频免费直播| 2022国内精品免费福利视频| 在线观看亚洲免费视频| 男女一进一出抽搐免费视频| 国产伦一区二区三区免费| 插鸡网站在线播放免费观看| 亚洲精品在线免费观看| 免费人成激情视频| 一级毛片a女人刺激视频免费| 久久精品国产亚洲AV麻豆~| 成人免费视频软件网站| 西西人体免费视频| 亚洲AV无码一区二区三区系列|