在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。比如说一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象。如果有一个1M的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了。那么如果要是每个字母都共享一个对象,那么就大大节约了资源。
下面用代码来举个例子:
TeacherFlyweight.java,抽象的TeacherFlyweight类
package com.wtz;
/**
* Created by wtz on 2017/9/16.
*/
/**
* 抽象的TeacherFlyweight类
*/
public abstract class TeacherFlyweight {
public abstract void teach();
}
Teacher.java,Teacher具体类
package com.wtz;
/**
* Created by wtz on 2017/9/16.
*/
/**
* Teacher具体类
*/
public class Teacher extends TeacherFlyweight {
private String name;
public Teacher(String name) {
this.name = name;
}
public void teach() {
System.out.println(this.name);
}
}
TeacherFlyweightFactory.java,Teacher工厂
package com.wtz;
/**
* Created by wtz on 2017/9/16.
*/
import java.util.HashMap;
import java.util.Hashtable;
/**
* Teacher工厂
*/
public class TeacherFlyweightFactory {
private Hashtable teacherFlyweights = new Hashtable();
public TeacherFlyweightFactory() {
}
public Teacher getTeacher(String name) {
Teacher teacher = (Teacher) teacherFlyweights.get(name);
if (teacher == null) {
teacher = new Teacher(name);
teacherFlyweights.put(name, teacher);
}
return teacher;
}
public int getTeacherFlyweightSize() {
return teacherFlyweights.size();
}
}
MainTeacherClass.java
package com.wtz;
/**
* Created by wtz on 2017/9/16.
*/
public class MainTeacherClass {
public static void main(String[] args){
TeacherFlyweightFactory teacherFlyweightFactory = new TeacherFlyweightFactory();
Teacher teacher1 = teacherFlyweightFactory.getTeacher("黎明");
Teacher teacher2 = teacherFlyweightFactory.getTeacher("王力宏");
Teacher teacher3 = teacherFlyweightFactory.getTeacher("黎明");
Teacher teacher4 = teacherFlyweightFactory.getTeacher("刘欢");
Teacher teacher5 = teacherFlyweightFactory.getTeacher("王力宏");
teacher1.teach();
teacher2.teach();
teacher3.teach();
teacher4.teach();
teacher5.teach();
System.out.println("老师的数量为:" + teacherFlyweightFactory.getTeacherFlyweightSize());
}
}
运行MainTeacherClass.java,结果如图:
老师的数量其实只有三个,以上就是享元模式。