笔记整理----高薪课程一 ---扩展(享元模式))
2015-01-23 16:52
190 查看
享元模式,按个人理解就是将共性属性或者方法抽取,形成一个个接口或者抽象类或者方法等。享元模式有两分:内部状态,外部状态。以方法为例:内部状态指的是该方法里边特有的属性或者变量。而外部状态指的是给这个方法传入的参数。
下边的解释是在网上找的资料,所谓享元模式,说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。在该模式中,包括抽象的享元,具体的享元,享元工厂以及客户端。其中抽象的享元为公共接口或抽象类,具体的享元实现抽象享元角色所规定的接口,享元工厂负责创建和管理享元角色。
下面写了一个程序实现享元模式:包括抽象享元角色Person.java,两个具体享元角色OldFlyweight.java和YoungFlyweight.java,享元工厂FlyweightFactory.java,最后是一个客户端测试类ClientTest_Flyweight.java。
Person.java:
1
package com.xpec.landon.trainjava.oop;
2
/**
3
* 一个普通的抽象类,人
4
* @author lvwenyong
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
OldFlyweight.java:
1
package com.xpec.landon.trainjava.designpattern;
2
3
import com.xpec.landon.trainjava.oop.Person;
4
5
/**
6
* 具体的一个享元,继承自Person
7
* @author lvwenyong
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
YoungFlyweight.java:
1
package com.xpec.landon.trainjava.designpattern;
2
3
import com.xpec.landon.trainjava.oop.Person;
4
5
/**
6
* 具体的一个享元,继承自Person
7
* @author lvwenyong
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
FlyweightFactory.java:
1
package com.xpec.landon.trainjava.designpattern;
2
import java.util.*;
3
4
import com.xpec.landon.trainjava.oop.Person;
5
/**
6
* 享元工厂
7
* @author lvwenyong
8
*
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:
1
package com.xpec.landon.trainjava.designpattern;
2
3
import com.xpec.landon.trainjava.oop.Person;
4
5
/**
6
* 享元模式中的客户端角色
7
* @author lvwenyong
8
*
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
下面是程序运行截图:
可以看到,第一次使用的时候是直接创建,以后再用到该对象的时候则是直接获取该对象。这就是享元模式的好处。
就好比是创建了一个类,这个被创建好的类可以随时被调用。
下边的解释是在网上找的资料,所谓享元模式,说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。在该模式中,包括抽象的享元,具体的享元,享元工厂以及客户端。其中抽象的享元为公共接口或抽象类,具体的享元实现抽象享元角色所规定的接口,享元工厂负责创建和管理享元角色。
下面写了一个程序实现享元模式:包括抽象享元角色Person.java,两个具体享元角色OldFlyweight.java和YoungFlyweight.java,享元工厂FlyweightFactory.java,最后是一个客户端测试类ClientTest_Flyweight.java。
Person.java:
1
package com.xpec.landon.trainjava.oop;
2
/**
3
* 一个普通的抽象类,人
4
* @author lvwenyong
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
OldFlyweight.java:
1
package com.xpec.landon.trainjava.designpattern;
2
3
import com.xpec.landon.trainjava.oop.Person;
4
5
/**
6
* 具体的一个享元,继承自Person
7
* @author lvwenyong
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
YoungFlyweight.java:
1
package com.xpec.landon.trainjava.designpattern;
2
3
import com.xpec.landon.trainjava.oop.Person;
4
5
/**
6
* 具体的一个享元,继承自Person
7
* @author lvwenyong
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
FlyweightFactory.java:
1
package com.xpec.landon.trainjava.designpattern;
2
import java.util.*;
3
4
import com.xpec.landon.trainjava.oop.Person;
5
/**
6
* 享元工厂
7
* @author lvwenyong
8
*
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:
1
package com.xpec.landon.trainjava.designpattern;
2
3
import com.xpec.landon.trainjava.oop.Person;
4
5
/**
6
* 享元模式中的客户端角色
7
* @author lvwenyong
8
*
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
下面是程序运行截图:
可以看到,第一次使用的时候是直接创建,以后再用到该对象的时候则是直接获取该对象。这就是享元模式的好处。
就好比是创建了一个类,这个被创建好的类可以随时被调用。
相关文章推荐
- 黑马程序员----(笔记整理----高薪课程一 ---扩展(享元模式))
- 黑马程序员----(笔记整理-------高薪课程一)
- 笔记整理(高薪课程二)
- 笔记整理-------(高薪课程一)
- 黑马程序员-------笔记整理(高薪课程二)
- 黑马程序员-----(高薪课程一-----扩展(反射))
- 韩顺平_轻松搞定网页设计(html+css+javascript)_ 第18讲_js课程介绍_js基本介绍_学习笔记_源代码图解_PPT文档整理
- JAVA高级工程师课程笔记整理——(九)JDBC与DBUtil
- C++课程学习笔记整理声明
- MARK!andrew ng的ml课程学习笔记,后续整理
- JAVA高级工程师课程笔记整理——(七)Mysql
- JAVA高级工程师课程笔记整理——(六)网页三剑客
- [台大机器学习笔记整理]noise and error measure以及在此基础上Learning flow的扩展
- DT大数据课程第一阶段第8讲高薪笔记和作业@王家林_DT大数据梦工厂
- JAVA高级工程师课程笔记整理——(八)tomcat与九大内置对象
- JAVA高级工程师课程笔记整理——(三)面向对象
- php扩展开发笔记(4)常用宏整理(更新中)
- JAVA高级工程师课程笔记整理——(一)初识JAVA
- JAVA高级工程师课程笔记整理——(十一)EL表达式与JSTL
- JAVA高级工程师课程笔记整理——(五)XML解析