设计模式(享元模式)

一、简介

享元模式是设计模式中少数几个已提高系统性能为目的模式之一。它的核心思想是:如果系统存在多个
相同的对象,那么只需要共享一分对象的拷贝,而不必为每一次使用都创建新的对象。

二、使用场景及优点

当有对象被大量复用时,特别是重量级的对象复用可以使用享元模式来提高系统性能。其优点如下:
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());
        
    }
}





posted @ 2013-11-28 08:31  Pocter  阅读(192)  评论(0编辑  收藏  举报