13-1 享元模式讲解






13-2 享元设计模式coding
现在,有一个场景,公司要求各个部门的管理者做一下年底总结报告,如果这些报告都已经生成过了,那么我们就没有必要再去new一个了;我们通过这么一个场景来体现一下享元模式:
有一个员工接口:
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.println("创建部门经理"+department);
String reportContent = department+"部门汇报:此次报告的主要内容是......";
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);
}
}
}
执行结果:
创建部门经理QA
创建报告QA部门汇报:此次报告的主要内容是…
创建部门经理RD
创建报告RD部门汇报:此次报告的主要内容是…
创建部门经理PM
创建报告PM部门汇报:此次报告的主要内容是…
创建部门经理BD
创建报告BD部门汇报:此次报告的主要内容是…
效果要和下面的这个差不多:这个就是一个享元模式
这个就是现在的类图:

我们在使用享元模式的时候,一定要注意线程安全的问题;
我们要理解好内部状态和外部的状态;
13-3 享元模式源码解析(jdk+tomcat)
- Integer类里面的valueOf方法;
- IntegerCache
- tomcat的连接池:GenericObjectPoolConfig
本文深入探讨享元模式的设计理念,通过年终报告生成场景,详细介绍享元模式的实现方式,包括员工接口、经理类及经理工厂的具体实现,并分析线程安全及内外部状态的重要性。同时,解析JDK和Tomcat中享元模式的应用实例。
2578

被折叠的 条评论
为什么被折叠?



