一、什么是享元模式?
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。
二、享元模式的角色和职责
1、抽象享元角色: 所有具体享元类的父类,规定一些实现的公共接口。
2、具体享元角色: 抽象享元角色的具体实现类,并实现抽象类中的方法。
3、享元工厂角色: 负责创建和管理享元角色。
三、优缺点及适应场景
优点:
1、它能够极大的减少系统中对象的个数。
2、由于其使用了外部状态,各个外部状态之间相对独立,不会影响到内部状态,所以享元模式使得享元对象能够在不同的环境被共享。
缺点:
1、由于对外部状态和内部状态的区分,使得应用程序在某种程度上来说更加复杂化了。
2、为了使对象可以共享,享元模式需要将享元对象的状态外部化,而读取外部状态使得运行时间变长。
适应场景:
针对享元模式的优点:
1、由于大量相同或者类似对象的使用,导致系统内存耗费严重。
2、大量内部状态可以转化为外部状态 ,可以将其转化并传入对象中。
四、具体代码:
/**
* @Title: Person.java
* @Package com.Flyweight
* @Description:
* @author xiaozhi
* @date 2016年12月6日 下午6:35:29
* @version V1.0
*/
package com.Flyweight;
public class Person {
private String name;
private String sex;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public Person(String name, String sex, String age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
public Person() {
}
}
/**
* @Title: Teacher.java
* @Package com.Flyweight
* @Description: TODO(用一句话描述该文件做什么)
* @author xiaozhi
* @date 2016年12月6日 下午6:39:17
* @version V1.0
*/
package com.Flyweight;
public class Teacher extends Person {
private String num = null;
public Teacher(String name, String sex, String age, String num) {
super(name, sex, age);
this.num = num;
}
public void setNum(String num) {
this.num = num;
}
public Teacher() {
}
}
/**
* @Title: TeacherFactory.java
* @Package com.Flyweight
* @Description: TODO(用一句话描述该文件做什么)
* @author xiaozhi
* @date 2016年12月6日 下午6:41:07
* @version V1.0
*/
package com.Flyweight;
import java.util.HashMap;
import java.util.Map;
public class TeacherFactory {
// 创建享元池
private Map<String, Teacher> pool;
public TeacherFactory() {
pool = new HashMap<String, Teacher>();
}
public Teacher getTeacher(String num) {
Teacher teacher = pool.get(num);
if (teacher == null) {
teacher = new Teacher();
teacher.setName(num);
pool.put(num, teacher);
}
return teacher;
}
}
/**
* @Title: MainClass.java
* @Package com.Flyweight
* @Description: 测试类
* @author xiaozhi
* @date 2016年12月6日 下午6:35:04
* @version V1.0
*/
package com.Flyweight;
public class MainClass {
public static void main(String[] args) {
TeacherFactory factory = new TeacherFactory();
Teacher t1 = factory.getTeacher("001");
Teacher t2 = factory.getTeacher("002");
Teacher t3 = factory.getTeacher("003");
Teacher t4 = factory.getTeacher("004");
System.out.println(t1.getName());
System.out.println(t2.getName());
System.out.println(t3.getName());
System.out.println(t4.getName());
if (t1 == t2) {
System.out.println("true");
} else {
System.out.println("false");
}
}
}
五、测试结果:
打折
卖书
赠送代金卷