I want to fly higher
          programming Explorer
          posts - 114,comments - 263,trackbacks - 0
              所謂享元模式,說在一個系統(tǒng)中如果有多個相同的對象,那么只共享一份就可以了,不必每個都去實(shí)例化一個對象。在該模式中,包括抽象的享元具體的享元享元工廠以及客戶端。其中抽象的享元為公共接口或抽象類,具體的享元實(shí)現(xiàn)抽象享元角色所規(guī)定的接口,享元工廠負(fù)責(zé)創(chuàng)建和管理享元角色。
              下面寫了一個程序?qū)崿F(xiàn)享元模式:包括抽象享元角色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,當(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)行截圖:


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

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

          FeedBack:
          # re: 學(xué)習(xí)設(shè)計(jì)模式之享元模式
          2010-07-10 17:38 | zhlwish
          不錯的文章,挺好  回復(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í)這是很早的時候?qū)懙模瑢懙暮艽植冢院髸貙懺O(shè)計(jì)模式相關(guān)的。@娃娃
            回復(fù)  更多評論
            
          # re: 學(xué)習(xí)設(shè)計(jì)模式之享元模式demo
          2012-10-04 14:22 | Lucker
          Person Name 這個變量沒有說明。
          還有就是flyweight的好處,并且在什么情況下使用,這里并沒有說明。  回復(fù)  更多評論
            
          主站蜘蛛池模板: 壶关县| 同德县| 林西县| 滨州市| 余江县| 图木舒克市| 丰城市| 仙桃市| 惠东县| 油尖旺区| 抚顺县| 当涂县| 江西省| 通榆县| 营山县| 深圳市| 临沂市| 多伦县| 昭觉县| 景德镇市| 兴隆县| 阳西县| 长乐市| 拉萨市| 河北省| 武宣县| 区。| 天等县| 九龙城区| 资溪县| 云浮市| 卓尼县| 新闻| 修水县| 遂川县| 泰和县| 通化市| 仙居县| 嘉兴市| 高碑店市| 罗城|