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 阅读(1717) 评论(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的好处,并且在什么情况下使用,这里并没有说明。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: