zoukankan      html  css  js  c++  java
  • 享元模式

    享元模式概述

    享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
    享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。

    引入应用示例帮助理解该模式

    代码示例

    package com.xnn;
    /**
        *   形状接口(抽象享元角色) 是所有具体享元类的超类,为具体享元类规定出需要实现的公共接口
        *   类(接口)描述:
     * @author xnn
     * 2018年11月5日下午10:06:38
     */
    public interface Shape {
       void draw();
    }
    
    package com.xnn;
    /**
        *   圆形类  实现Shape接口    是具体的享元角色
        *   类(接口)描述:
     * @author xnn
     * 2018年11月5日下午10:09:34
     */
    public class Circle implements Shape {
       private String color;
       private int x;
       private int y;
       private int radius;
     
       public Circle(String color){
          this.color = color;     
       }
     
       public void setX(int x) {
          this.x = x;
       }
     
       public void setY(int y) {
          this.y = y;
       }
     
       public void setRadius(int radius) {
          this.radius = radius;
       }
    /**
       * 绘画方法
     */
    public void draw() {
    	 System.out.println("Circle: Draw() [Color : " + color 
    	         +", x : " + x +", y :" + y +", radius :" + radius);	
    } 
    }
    
    package com.xnn;
    import java.util.HashMap;
    /**
     *   享元工厂角色  负责创建和管理享元角色   该角色必须保证享元对象可以被系统适当的共享
     *   类(接口)描述:
    * @author xnn
    * 2018年11月5日下午10:10:45
    */
    public class ShapeFactory {
    	//具体享元角色的map集合,color作为键,Shape的实现类 (即具体的享元角色)作为值
       private static final HashMap<String, Shape> circleMap = new HashMap<>();
       //得到具体享元角色的方法,传入参数是color(因此Circle类中只提供了color域的构造器)
       public static Shape getCircle(String color) {
    	   //根据键获取值
          Circle circle = (Circle)circleMap.get(color);
          //检查系统中是否已经有一个符合要求的享元对象
          
          if(circle == null) {
        	  //如果没有,享元工厂角色就要适当的创建一个合适的享元对象。
             circle = new Circle(color);
             circleMap.put(color, circle);
             System.out.println("Creating circle of color : " + color);
          }
          //如果有,直接返回这个享元对象
          return circle;
       }
    }
    
    package com.xnn;
    /**
         * 客户端角色   
        *   类(接口)描述:
     * @author xnn
     * 2018年11月5日下午10:13:49
     */
    public class FlyweightPatternDemo {
       private static final String colors[] = 
          { "Red", "Green", "Blue", "White", "Black" };
       public static void main(String[] args) {
     
          for(int i=0; i < 20; ++i) {
             Circle circle = 
                (Circle)ShapeFactory.getCircle(getRandomColor());
             circle.setX(getRandomX());
             circle.setY(getRandomY());
             circle.setRadius(100);
             circle.draw();
          }
       }
       private static String getRandomColor() {
          return colors[(int)(Math.random()*colors.length)];
       }
       private static int getRandomX() {
          return (int)(Math.random()*100 );
       }
       private static int getRandomY() {
          return (int)(Math.random()*100);
       }
    }
    

    上述例子所表现出来的类的结构图:

    运行结果:

    模式中的角色

    由上述例子,我们可以看出该模式中有这样几个角色

    对此模式的总结

    模式意图

    运用共享技术有效地支持大量细粒度的对象。

    模式主要解决

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

    模式何时使用

    1、系统中有大量对象;
    2、这些对象消耗大量内存;
    3、这些对象的状态大部分可以外部化;
    4、这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替;
    5、系统不依赖于这些对象身份,这些对象是不可分辨的。

    模式如何实现

    用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象。

    模式关键代码

    用 HashMap 存储这些对象。

    模式应用实例

    1、JAVA 中的 String,如果有则返回,如果没有则创建一个字符串保存在字符串缓存池里面;
    2、数据库的数据池。

    模式优点

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

    模式缺点

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

    模式使用场景

    1、系统有大量相似对象;
    2、需要缓冲池的场景。

    模式注意事项

    1、注意划分外部状态和内部状态,否则可能会引起线程安全问题;
    2、这些类必须有一个工厂对象加以控制。

  • 相关阅读:
    【小记事】如何设置vscode代码格式化时不要自动换行
    ES6的Array.from()和Array.fill()方法
    Android Studio Run/Debug configuration error: Module not specified
    合并PPT_Powerpint文件_保持主题颜色/Merge PowerPoint Keep Source Format
    Matlab 文件格式化/Matlab Source File Formattor
    Look into Bitmap images
    pdf2eps implement
    LyX Error convert to loadable format
    Fuzzy模糊推导(Matlab实现)
    Batch批处理获取当前时间
  • 原文地址:https://www.cnblogs.com/nnxud/p/9912205.html
Copyright © 2011-2022 走看看