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

    1、用途

      享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。属于结构型模式,提供了一种减少对象数量从而改善应用所需的对象结构的方式。

    2、意图

      运营共享计算有效地支持大量细粒度的对象。

    3、主要解决

      在存在大量对象时,有可能会造成内存溢出,我们把其他共同的部分抽象处理,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。

    4、使用场景

    (1)系统有大量相似对象;

    (2)需要缓存池的场景;

    (3)细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份。

    5、UML类图

     享元模式注意包含三种角色:

    •  抽象享元模式(Flyweight):享元对象抽象基类或者接口,同时定义出对象的外部状态和内部状态的接口或实现;
    • 具体享元角色(ConcreteFlyweight):实现抽象角色定义的业务。该角色的内部状态处理应该与环境无关,不能出现会有一个操作改变内部状态,同时修改了外部状态;
    • 享元工厂(FlyweightFactory): 负责管理享元对象池和创建享元对象。

     6、代码实例

    1 /**
    2  * @author it-小林
    3  * @desc 网站抽象类
    4  * @date 2021年07月31日 14:08
    5  */
    6 public abstract class WebSite {
    7     public abstract void use();
    8 }
     1 /**
     2  * @author it-小林
     3  * @desc 具体网站类
     4  * @date 2021年07月31日 14:10
     5  */
     6 public class ConcreteWebSite extends WebSite{
     7 
     8     private String name = "";
     9 
    10     public ConcreteWebSite(String name) {
    11         this.name = name;
    12     }
    13 
    14     @Override
    15     public void use() {
    16         System.out.println("网站分类:" + name);
    17     }
    18 }
    /**
     * @author it-小林
     * @desc 网站工厂类
     * @date 2021年07月31日 14:11
     */
    public class WebSiteFactory {
        private HashMap<String, ConcreteWebSite> pool = new HashMap<>();
    
        //获取网站分类
        public WebSite getWebSiteCategory(String key){
            if(!pool.containsKey(key)){
                pool.put(key, new ConcreteWebSite(key));
            }
            return pool.get(key);
        }
    
    
        //获得网站分类总数
        public int getWebSiteCount(){
            return pool.size();
        }
    }
    /**
     * @author it-小林
     * @desc 客户端
     * @date 2021年07月31日 14:15
     */
    public class Client {
    
        public static void main(String[] args) {
            WebSiteFactory webSiteFactory = new WebSiteFactory();
    
            WebSite fx = webSiteFactory.getWebSiteCategory("产品展示");
            fx.use();
    
            WebSite fy = webSiteFactory.getWebSiteCategory("产品展示");
            fy.use();
    
            WebSite fz = webSiteFactory.getWebSiteCategory("产品展示");
            fz.use();
    
            WebSite fa = webSiteFactory.getWebSiteCategory("博客");
            fa.use();
    
            WebSite fb = webSiteFactory.getWebSiteCategory("博客");
            fb.use();
    
            WebSite fc = webSiteFactory.getWebSiteCategory("博客");
            fc.use();
    
            System.out.println("网站分类总数:" + webSiteFactory.getWebSiteCount());
        }
    }

    7、注意事项

    (1)注意划分外部状态和内部状态,否则可能会引起线程安全问题;

    (2)这些类必须有一个工厂对象加以控制。

    8、优缺点

    优点:大大减少对象的创建,降低系统的内存,使效率提高。

    缺点:提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。

    如本文有侵权行为,请及时与本人联系,多多包涵! 小生初出茅庐,多多指教!

    本文来自博客园,作者:it-小林,转载请注明原文链接:https://www.cnblogs.com/linruitao/p/15067823.html

  • 相关阅读:
    汇编语言-端口和外中断
    汇编语言-标志寄存器
    汇编程序-更灵活的定位内存地址方法
    汇编语言-[BX]和loop指令
    汇编语言-环境安装及各个寄存器介绍
    读书笔记-原码, 反码, 补码 详解
    读书笔记-整洁代码编写
    iOS-SQLite数据库使用介绍
    JSP-tag文件使用介绍
    【】maven 配置启动tomcat版本,修改默认的6.x.x版本
  • 原文地址:https://www.cnblogs.com/linruitao/p/15067823.html
Copyright © 2011-2022 走看看