享元模式
摘要
本文通过简洁的模式描述,应用场景的详细代码实现,以及匹配的UML,详解介绍了享元模式的原理及应用。本文可帮助读者快速掌握享元模式,以便工作学习中使用享元模式。
一、享元模式
在生活中,我们身边有很多工具,当我们需要某一个工具时,首先是查看自己是否拥有该工具,如果没有工具,则去买或制作一个,如果有工具,则直接拿来用,用完放在原处,等待下一次使用,但决不会马上销毁该工具。
在编程中,某些对象也扮演着工具角色,它会被频繁使用,如果每次使用时再创建,同时用完即销毁,这样会消耗太多资源,同时效率不高。
享元模式就是指让对象元素可以进行共享,就解决了频繁使用的麻烦。享元模式在对象创建工厂中加入缓存技术即可。当需要创建一个对象时,先查看工厂中是否已经创建,如果创建了,则调用已有的对象,如果还没创建则进行创建。
二、享元模式的实现
2.1 场景设计
在学校系统中,经常会用到各个学生对象,如果用到时创建,用完时销毁,效率太低。所以需要加入享元模式。
2.2 代码实现
2.2.1 Student 学生抽象类
package ft.patterns.Flyweight;
public interface Student {
// subject作为外蕴状态 对一个具体对象是变动数据
public void study(String subject);
}
2.2.2 CollegeStudent 学生具体类
package ft.patterns.Flyweight;
public class CollegeStudent implements Student{
// 内蕴状态 对于一个具体对象是不变数据
String name;
// 不变数据作为构造参数传进入
CollegeStudent(String name){
this.name = name;
}
// 变动数据作为方法参数传入
@Override
public void study(String subject) {
System.out.println(name+" is starting "+subject);
}
}
2.2.3 StudentFactory 学生工厂类
package ft.patterns.Flyweight;
import java.util.HashMap;
import java.util.Map;
public class StudentFactory {
public static Map<String,Student> studentMap;
static {
studentMap = new HashMap<String,Student>();
}
public static Student getStudent(String name) {
Student student = null;
if(!studentMap.containsKey(name)) {
student = new CollegeStudent(name);
studentMap.put(name, student);
}
else {
student = studentMap.get(name);
}
return student;
}
}
2.2.4 Main 测试类
package ft.patterns.Flyweight;
public class Main {
public static void main(String[] args) {
Student Tom = StudentFactory.getStudent("Tom");
Student Damon = StudentFactory.getStudent("Damon");
Tom.study("Math");
Damon.study("Computer");
Student Tom1 = StudentFactory.getStudent("Tom");
Student Damon1 = StudentFactory.getStudent("Damon");
System.out.println("Tom ====> "+Tom);
System.out.println("Tom1 ====> "+Tom1);
System.out.println("Damon ====> "+Damon);
System.out.println("Damon1 ====> "+Damon1);
}
}
2.2.5 测试结果
Tom is starting Math
Damon is starting Computer
Tom ====> ft.patterns.Flyweight.CollegeStudent@5caf905d
Tom1 ====> ft.patterns.Flyweight.CollegeStudent@5caf905d
Damon ====> ft.patterns.Flyweight.CollegeStudent@27716f4
Damon1 ====> ft.patterns.Flyweight.CollegeStudent@27716f4