一、简介
享元模式是设计模式中少数几个已提高系统性能为目的模式之一。它的核心思想是:如果系统存在多个相同的对象,那么只需要共享一分对象的拷贝,而不必为每一次使用都创建新的对象。
二、使用场景及优点
当有对象被大量复用时,特别是重量级的对象复用可以使用享元模式来提高系统性能。其优点如下: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());
}
}