下面寫了一個程序?qū)崿F(xiàn)享元模式:包括抽象享元角色Person.java,兩個具體享元角色OldFlyweight.java和YoungFlyweight.java,享元工廠FlyweightFactory.java,最后是一個客戶端測試類ClientTest_Flyweight.java。
Person.java:
1
package com.landon.trainjava.oop;
2
/**
3
* 一個普通的抽象類,人
4
* @author landon
5
*
6
*/
7
public 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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

OldFlyweight.java:
1
package com.landon.trainjava.designpattern;
2
3
import com.landon.trainjava.oop.Person;
4
5
/**
6
* 具體的一個享元,繼承自Person
7
* @author landon
8
*
9
*/
10
public 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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

YoungFlyweight.java:
1
package com.landon.trainjava.designpattern;
2
3
import com.landon.trainjava.oop.Person;
4
5
/**
6
* 具體的一個享元,繼承自Person
7
* @author landon
8
*
9
*/
10
public 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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

FlyweightFactory.java:
1
package com.landon.trainjava.designpattern;
2
import java.util.*;
3
4
import com.landon.trainjava.oop.Person;
5
/**
6
* 享元工廠
7
* @author landon
8
*
9
*/
10
11
public 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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

ClientTest_Flyweight.java:
1
package com.landon.trainjava.designpattern;
2
3
import com.landon.trainjava.oop.Person;
4
5
/**
6
* 享元模式中的客戶端角色
7
* @author landon
8
*
9
*/
10
public 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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

下面是程序運(yùn)行截圖:
可以看到,第一次使用的時候是直接創(chuàng)建,以后再用到該對象的時候則是直接獲取該對象。這就是享元模式的好處。