zoukankan      html  css  js  c++  java
  • 设计模式(享元模式)

    一、简介

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

    二、使用场景及优点

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





  • 相关阅读:
    Labeling Balls
    Following Orders
    Frame Stacking
    Window Pains
    Sort it all out
    Ferry Loading||
    今年暑假不AC
    xcode10 出现 框架 或者 pod 出错
    网络请求 步骤
    swift UIAlertController使用 UIAlertController的宽度 为270
  • 原文地址:https://www.cnblogs.com/pocter/p/3684455.html
Copyright © 2011-2022 走看看