设计模式学习笔记:享元模式(Flyweight)

文章目录

  • 一、享元模式介绍
  • 二、使用场景
  • 三、实例讲解
  • 四、代码示例
  • 五、输出结果

一直以为人是慢慢长大的,其实不是,人是在一瞬间长大的。

一、享元模式介绍

享元模式是设计模式中结构型模式的一种。主要用于减少创建对象的数量,以减少内存占用和提高性能。

享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。

二、使用场景

  1. 系统中有大量相似对象

    • 日志对象工厂,获取日志对象时并不会每次创建日志对象,而是通过日志工厂获取,日志工程获取日志对象时会先从缓冲池里取日志对象,取不到才会新建日志对象返回。
  2. 需要缓冲池的场景

    • 字符串缓冲池
    • 数据库连接池
    • 线程池

三、实例讲解

有一个系统中需要画很多圆型,圆(Circle)的属性如下:颜色(color)、半径(radius)、横坐标(x)、纵坐标(y)。其中颜色的种类是有限的。这个时候就可以把颜色作为固定属性创建有限个对象。使用圆对象时将其它属性作为参数传入。

设计模式学习笔记:享元模式(Flyweight)_第1张图片

四、代码示例

Circle(圆形):

/**
 * 圆形
 *
 * @author ZhengNC
 * @date 2020/9/8 11:08
 */
public class Circle {

    private String color;

    public Circle(String color){
        this.color = color;
    }

    /**
     * 画圆
     *
     * @param x 横坐标
     * @param y 纵坐标
     * @param radius 半径
     */
    public void draw(int x, int y, int radius){
        System.out.println(
                String.format("画出一个圆 " +
                        "{颜色:%s," +
                        "坐标:(%d, %d)," +
                        "半径:%d}",
                        color, x, y, radius)
        );
    }
}

CircleFactory(圆形工厂):

/**
 * 圆形工厂
 *
 * @author ZhengNC
 * @date 2020/9/8 11:14
 */
public class CircleFactory {

    /**
     * 圆形缓存
     */
    private static Map<String, Circle> circleMap = new HashMap<>();

    /**
     * 获取圆形
     *
     * @param color 颜色
     * @return
     */
    public synchronized static Circle getCircle(String color){
        Circle circle = circleMap.get(color);
        if (circle == null){
            circle = new Circle(color);
            circleMap.put(color, circle);
        }
        return circle;
    }
}

TestFlyweight(测试享元模式):

/**
 * 测试享元模式
 *
 * @author ZhengNC
 * @date 2020/9/8 11:19
 */
public class TestFlyweight {

    public static void main(String[] args) {
        Circle redCircle = CircleFactory.getCircle("red");
        System.out.println(redCircle);
        redCircle.draw(1, 1, 1);
        Circle blueCircle = CircleFactory.getCircle("blue");
        System.out.println(blueCircle);
        blueCircle.draw(22, 12, 3);
        Circle redCircle2 = CircleFactory.getCircle("red");
        System.out.println(redCircle2);
        redCircle2.draw(23, 22, 4);
    }
}

五、输出结果

输出结果的同时打印出使用的对象的地址,可以发现对象被复用了。

com.test.javademo.designpattern.flyweight.Circle@62ee68d8
画出一个圆 {颜色:red,坐标:(1, 1),半径:1}
com.test.javademo.designpattern.flyweight.Circle@3f49dace
画出一个圆 {颜色:blue,坐标:(22, 12),半径:3}
com.test.javademo.designpattern.flyweight.Circle@62ee68d8
画出一个圆 {颜色:red,坐标:(23, 22),半径:4}

你可能感兴趣的:(设计模式,设计模式,java)