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 閱讀(1736) 評論(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的好處,并且在什么情況下使用,這里并沒有說明。  回復  更多評論
            
          主站蜘蛛池模板: 布尔津县| 西城区| 田东县| 通山县| 铜鼓县| 海宁市| 河曲县| 盐亭县| 班戈县| 安阳县| 庆阳市| 安西县| 宁化县| 岐山县| 吕梁市| 宾阳县| 固镇县| 田东县| 宣城市| 鲁甸县| 汤原县| 恩平市| 加查县| 微博| 霍州市| 阿拉善右旗| 永定县| 松滋市| 岚皋县| 班戈县| 巫溪县| 佛冈县| 开鲁县| 邻水| 西畴县| 临朐县| 贺兰县| 彭阳县| 浠水县| 西藏| 丰台区|