项目源码已提交github:https://github.com/ckl001/designPattem_java
说到享元模式,第一个想到的应该就是池技术了,String常量池、数据库连接池、缓冲池等等都是享元模式的应用,所以说享元模式是池技术的重要实现方式。
比如我们每次创建字符串对象时,都需要创建一个新的字符串对象的话,内存开销会很大,所以如果第一次创建了字符串对象"adam", 下次再创建相同的字符串"adam"时,只是把它的引用指向”adam“,这样就实现了”adam“字符串再内存中的共享。
举个最简单的例子,网络联机下棋的时候,一台服务器连接了多个客户端(玩家),如果我们每个棋子都要创建对象,那一盘棋可能就有上百个对象产生,玩家多点的话,因为内存空间有限,一台服务器就难以支持了,所以这里要使用享元模式, 将棋子对象减少到几个实例。
package com.Ljava.design.pattem.structural.flyweight;
/**
* @Auther 20173
* @Date 2019-4-9 16:35
* @Des 员工
**/
public interface Employee {
void report();
}
package com.Ljava.design.pattem.structural.flyweight;
/**
* @Auther 20173
* @Date 2019-4-9 16:37
* @Des 管理者
**/
public class Manager implements Employee {
@Override
public void report() {
System.out.println();
}
private String title = "部门经理";
private String department;
private String reportContent;
public void setReportContent(String reportContent) {
this.reportContent = reportContent;
}
public Manager(String department) {
this.department = department;
}
}
package com.Ljava.design.pattem.structural.flyweight;
import java.util.HashMap;
import java.util.Map;
/**
* @Auther 20173
* @Date 2019-4-9 16:35
* @Des 经理(员工)工厂 -> 享元工厂
**/
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 + "部门汇报:此次报告的主要内容是%$$!@@#$%@#$%@#$SSFS#$F%S^F";
manager.setReportContent(reportContent);
System.out.println("创建报告:" + reportContent);
EMPLOYEE_MAP.put(department, manager);
}
return manager;
}
}
package com.Ljava.design.pattem.structural.flyweight;
/**
* @Auther 20173
* @Date 2019-4-9 16:40
* @Des TODO
**/
public class Test {
private static final String departments[] = {"RD","QA","PM","BD"};
public static void main(String[] args) {
for(int i=0; i<20; i++){
String department = departments[(int)(Math.random() * departments.length)];
Manager manager = (Manager) EmployeeFactory.getManager(department);
manager.report();
}
}
}