----------------------android培训、java培训、期待与您交流!----------------------
享元模式,按个人理解就是将共性属性或者方法抽取,形成一个个接口或者抽象类或者方法等。享元模式有两分:内部状态,外部状态。以方法为例:内部状态指的是该方法里边特有的属性或者变量。而外部状态指的是给这个方法传入的参数。
下边的解释是在网上找的资料,所谓享元模式,说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。在该模式中,包括抽象的享元,具体的享元,享元工厂以及客户端。其中抽象的享元为公共接口或抽象类,具体的享元实现抽象享元角色所规定的接口,享元工厂负责创建和管理享元角色。
下面写了一个程序实现享元模式:包括抽象享元角色Person.java,两个具体享元角色OldFlyweight.java和YoungFlyweight.java,享元工厂FlyweightFactory.java,最后是一个客户端测试类ClientTest_Flyweight.java。
Person.java:
package com.xpec.landon.trainjava.oop;
2
/**3
* 一个普通的抽象类,人4
* @author lvwenyong5
*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 Setters16
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:
package com.xpec.landon.trainjava.designpattern;
2
3
import com.xpec.landon.trainjava.oop.Person;
4
5
/**6
* 具体的一个享元,继承自Person7
* @author lvwenyong8
*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
YoungFlyweight.java:
package com.xpec.landon.trainjava.designpattern;
2
3
import com.xpec.landon.trainjava.oop.Person;
4
5
/**6
* 具体的一个享元,继承自Person7
* @author lvwenyong8
*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
FlyweightFactory.java:
package com.xpec.landon.trainjava.designpattern;
2
import java.util.*;
3
4
import com.xpec.landon.trainjava.oop.Person;
5
/**6
* 享元工厂7
* @author lvwenyong8
*9
*/
10
11
public
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:
package com.xpec.landon.trainjava.designpattern;
2
3
import com.xpec.landon.trainjava.oop.Person;
4
5
/**6
* 享元模式中的客户端角色7
* @author lvwenyong8
*9
*/
10
public
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
下面是程序运行截图:

可以看到,第一次使用的时候是直接创建,以后再用到该对象的时候则是直接获取该对象。这就是享元模式的好处。
----------------------android培训、java培训、期待与您交流!----------------------
本文深入探讨了享元模式的概念、组成部分以及其实现过程,通过具体代码展示了如何利用享元模式减少对象实例的数量,提高程序性能。文章还提供了一个简单的程序示例,包括抽象享元角色、具体享元角色、享元工厂以及客户端测试类。
766

被折叠的 条评论
为什么被折叠?



