文章目录
-
- 享元模式
-
- 1. 分析
- 2. 示例
- 3. 源码
享元模式
1. 分析
-
定义
提供了减少对象数量从而改善应用所需的对象结构的方式
运用共享技术有效地支持大量细粒度的对象
- 类型:
结构型
-
适用场景
常常应用于系统底层的开发,以便解决系统的性能问题
系统有大量相似的对象、需要缓冲池的场景
如(String、数据库连接池、线程池)
-
优点
减少对象的创建,降低内存中对象的数量,减少内存的占用,从而提高性能
减少内存之外的其它资源占用
-
缺点
关注内/外部状态、关注线程安全问题
使系统、程序的逻辑复杂化
-
扩展
内部状态:记录在享元对象的内部,不会随着环境的改变而改变的共享部分(类似 享元对象的一个属性)
外部状态:记录在享元对象的外部,会随着环境的改变而改变
- 模式比较
-
享元模式与代理模式
代理模式生成代理类,花费的时间比较多,可以使用享元模式提高程序的处理速度
-
享元模式与单例模式
享元模式:复用对象的思想
2. 示例
public interface Employee {
void report();
}
public class Manager implements Employee {
private String department;
private String reportContent;
public Manager(String department) {
this.department = department;
}
public void setReportContent(String reportContent) {
this.reportContent = reportContent;
}
@Override
public void report() {
System.out.println(reportContent);
}
}
public class EmployeeFactory {
private static final Map<String, Employee> EMPLOYEE_MAP = new HashMap<>();
public static Employee getManager(String department) {
Manager manager = (Manager) EMPLOYEE_MAP.get(department);
if (manager == null) {
manager = new Manager(department);
System.out.print("创建部门经理:" + department);
String reportContent = department + "\t部门汇报:此次报告的主要内容是:....";
manager.setReportContent(reportContent);
System.out.println(" 创建报告:" + reportContent);
EMPLOYEE_MAP.put(department, manager);
}
return manager;
}
}
public class Test {
private static final String[] departments = {"RD", "QA", "PM", "BD"};
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
String department = departments[(int) (Math.random() * departments.length)];
Manager manager = (Manager) EmployeeFactory.getManager(department);
manager.report();
}
}
}
3. 源码
java.lang.Integer
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
org.apache.commons.pool2.impl.GenericKeyedObjectPool