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

     一、定义

      通过共享支持大量细粒度的对象。

    二、使用场景

      程序中有大量相似对象,并且占大量内存,这种场景下,我们通过共享内存来减少创建重复的对象,从而节约内存资源。

    三、应用实例

      1.缓存池:字符串常量

      2.棋子游戏,文字编辑

    四、模式结构

      UML图:

      

      Flyweight:抽象享元类。

      ConcreteFlyweight:具体享元类,实现了Flyweight。指定内部状态。

      UnsharedConcreteFlyweight:非享元类。

          FlyweightFactory:享元创建工厂类。

    五、实现  

    /**
     * 抽象享元类:形状
     */
    public abstract class Shape {
        // 绘画
        public abstract void draw();
    }
    
    /**
     * 具体享元类:圆
     */
    @Data
    public class Circle extends Shape {
        private String color;
    
        public Circle(String color) {
            this.color = color;
        }
    
        @Override
        public void draw() {
            System.out.println("画了一个" + this.color + "圆");
        }
    }
    
    /**
     * 享元工厂类
     */
    public class ShapeFactory {
        private static HashMap<String, Shape> shapeMap = new HashMap();
    
        public static Shape getShape(String color) {
            Shape shape = shapeMap.get(color);
            if (Objects.isNull(shape)) {
                // 没有则创建新的对象
                shape = new Circle(color);
                shapeMap.put(color, shape);
            }
            return shape;
        }
    
        public static int getSum(){
            return shapeMap.size();
        }
    }
    
    public class DrawClient{
        public static void main(String[] args) {
            Shape shape1 = ShapeFactory.getShape("红");
            shape1.draw();
    
            Shape shape2 = ShapeFactory.getShape("灰");
            shape2.draw();
    
            Shape shape3 = ShapeFactory.getShape("绿");
            shape3.draw();
    
            Shape shape4 = ShapeFactory.getShape("红");
            shape4.draw();
    
            Shape shape5 = ShapeFactory.getShape("灰");
            shape5.draw();
    
            Shape shape6 = ShapeFactory.getShape("灰");
            shape6.draw();
    
            System.out.println("一共绘制了"+ShapeFactory.getSum()+"种颜色的圆形");
        }
    }

    运行结果:

    画了一个红圆
    画了一个灰圆
    画了一个绿圆
    画了一个红圆
    画了一个灰圆
    画了一个灰圆
    一共绘制了3种颜色的圆形

      

  • 相关阅读:
    Unix&Linux下常见的性能分析工具介绍
    理解Load Average做好压力测试
    cron 的配置和说明
    原生js模仿下拉刷新功能
    webpack初步了解
    数组的迭代方法
    webpack4
    反思面向对象
    C和lua的互相调用
    对Zookeeper的一些分析
  • 原文地址:https://www.cnblogs.com/ITyannic/p/12439495.html
Copyright © 2011-2022 走看看