一、简介
享元模式是设计模式中少数几个已提高系统性能为目的模式之一。它的核心思想是:如果系统存在多个
相同的对象,那么只需要共享一分对象的拷贝,而不必为每一次使用都创建新的对象。
二、使用场景及优点
当有对象被大量复用时,特别是重量级的对象复用可以使用享元模式来提高系统性能。其优点如下:
1.可以节省重复创建对象的开销,因为被享元模式维护的相同对象只会被创建一次,当创建对象比
较耗时时,变可以节省大量时间。
2.由于创建的对象数减少,系统内存需求也减小了,这对GC的压力也相应的降低了,进而使系统
有一个健康的内存结构和更快的反应熟读。
三、常见表现形式
享元模式共分三部分:享元工厂、业务接口、业务实现,其中享元工厂是其核心,是享元模式的精髓所在。
1.业务接口
public interface ICloudService{ /** * 获取server服务 */ Object getCloudStoreServer(); /** * 获取存储空间 */ Object getMyStoreInfo(String account); }
2.业务实现
public class CloudServiceImp implements ICloudService{ String serverCode = null; Object server = null; public CloudServiceImp(String serverCode){ this.serverCode = serverCode; /* * 初始化server对象,如链接远端服务、查询数据库、解析xml等动态实例化工作。 */ server = (Object)"Cloud server : 115, 221.43.29.38, ...."; } @Override public Object getCloudStoreServer() { return server; } @Override public Object getMyStoreInfo(String account) { return (Object)account+" space:hourse for me, total 2028M, used 1320M, ...."; } }
3.享元工厂
/* * 享元工厂是享元模式的核心,确保系统可以共享相同的对象。 */ public class CloudServerFactory{ private Map<String,ICloudService> cloudService = new HashMap<String,ICloudService>(); public ICloudService getCloudServer(String serverCode) { ICloudService server = cloudService.get(serverCode); if(server == null) { //通过serverCode共享server服务器服务,避免相同的服务器服务被多次创建 server = new CloudServiceImp(serverCode); cloudService.put(serverCode,server); } return server; } }
四、测试
public class FlyWeightTest{ @Test public void flyWeight(){ CloudServerFactory factory = new CloudServerFactory(); ICloudService service = factory.getCloudServer("0014440"); Object serverInfo = service.getCloudStoreServer(); Object mySp = service.getMyStoreInfo("zhangsan"); System.out.println(serverInfo.toString()); System.out.println(mySp.toString()); } }