<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伊人久久综合密臀性色| 亚洲va在线va天堂va888www| 亚洲国产精品久久久久| 亚洲国产91在线| 国产成人无码免费看片软件| 国产妇乱子伦视频免费| 亚洲国产天堂久久综合| 亚洲国产精品无码久久久| 日本一区二区在线免费观看| 免费成人激情视频| 亚洲精品专区在线观看| 亚洲乱码中文论理电影| 中文字幕免费在线播放| 成人免费无码大片A毛片抽搐| 亚洲国产综合无码一区| 亚洲精品久久无码| 99精品视频在线观看免费专区| 国产精品免费看香蕉| 亚洲福利视频网站| 中文字幕在线视频免费观看| 成年人性生活免费视频| 久久久亚洲欧洲日产国码二区| 美女被吸屁股免费网站| 久草视频免费在线观看| 亚洲日韩精品无码一区二区三区 | 一本岛v免费不卡一二三区| 久久笫一福利免费导航| 亚洲av无码一区二区三区乱子伦| 老司机午夜精品视频在线观看免费| 69式互添免费视频| 久久夜色精品国产亚洲AV动态图| 麻豆一区二区三区蜜桃免费| 三年片在线观看免费大全| 久久综合图区亚洲综合图区| 一级黄色片免费观看| 在线jyzzjyzz免费视频| 亚洲性色高清完整版在线观看| 国产免费AV片在线观看| 亚洲日韩涩涩成人午夜私人影院| 亚洲精品乱码久久久久蜜桃| 日韩一区二区a片免费观看 |