一.定义与类型
1.定义:提供了减少对象数量从而改善应用所需的对象结构的方式
运用共享技术有效地支持大量细粒度的对象
2.类型:结构型
二.适用场景
1.常常用于系统底层的开发,以便解决系统的性能问题
2.系统有大量相似对象、需要缓冲池的场景
三.优点
1.减少对象的创建,降低内存中对象的数量,降低系统的内存,提高效率
2.减少内存之外的其他资源占用
四.缺点
1.关注内/外部状态、关注线程安全问题
2.使系统、程序的逻辑复杂化
五.扩展
1.内部状态
不会随着环境改变而改变的共享部分
2.外部状态
六.UML
7.代码
Employee.java
package com.caomingyu.autotest.flyweight;
public interface Employee {
void report();
}
Manager.java
package com.caomingyu.autotest.flyweight;
public class Manager implements Employee {
public void report() {
System.out.println(reportContent);
}
private String department;
private String reportContent;
public void setReportContent(String reportContent) {
this.reportContent = reportContent;
}
public Manager(String department) {
this.department = department;
}
}
EmployeeFactory.java
package com.caomingyu.autotest.flyweight;
import java.util.HashMap;
import java.util.Map;
public class EmployeeFactory {
//Map相当于对象池
private static final Map<String, Employee> EMPLOYEE_MAP = new HashMap<String, Employee>();
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;
}
}
Test.java
package com.caomingyu.autotest.flyweight;
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();
}
}
}
享元模式要考虑线程安全问题,这里的map并不是线程安全的,因为这里场景简单不需要。department是外部状态