[4] [对象性能] ( 2 ) 享元模式 Flyweight

总结

  • 干什么用的?
    避免了创建大量相似对象, 减少了内存占用.
    (可以简单理解为一个对象池)


  • 细节
    把实例的共享状态和非共享状态分开.
    (画图工具例子中的颜色是共享的, X Y 半径是非共享的)


  • 场景
    String常量池
    数据库连接池
    缓冲池
    文字编辑器
    图形应用
    游戏开发


java例子1

重构前

package v20_flyweight.java;

class Circle {
    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.printf("Drawing circle of color %s at position (%d, %d) with radius %d\n", color, x, y, radius);
    }
}

public class DrawingApp1 {
    public static void main(String[] args) {
        Circle redCircle = new Circle("red");
        redCircle.setX(10);
        redCircle.setY(10);
        redCircle.setRadius(50);
        redCircle.draw();

        Circle blueCircle = new Circle("blue");
        blueCircle.setX(20);
        blueCircle.setY(20);
        blueCircle.setRadius(60);
        blueCircle.draw();
    }
}





重构后

package v20_flyweight.java;

import java.util.HashMap;
import java.util.Map;

interface Shape {
    void draw(int x, int y, int radius);
}

class CircleFlyweight implements Shape { // CircleFlyweight对象最好是只读的
    private String color; // color是共享状态

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

	// x,y,radius是非共享状态
    @Override
    public void draw(int x, int y, int radius) {
        System.out.printf("Drawing circle of color %s at position (%d, %d) with radius %d\n", 
            color, x, y, radius);
    }
}

class ShapeFactory {
	// CircleFlyweight对象最好是只读的
    private static final Map<String, CircleFlyweight> circleMap = new HashMap<>();

    public static CircleFlyweight getCircle(String color) {
        CircleFlyweight circle = circleMap.get(color);
        
        if (circle == null) {
            circle = new CircleFlyweight(color);
            circleMap.put(color, circle);
            System.out.println("Creating circle of color: " + color);
        }
        
        return circle;
    }
}

public class DrawingApp2 {
    public static void main(String[] args) {
        CircleFlyweight redCircle = ShapeFactory.getCircle("red");
        redCircle.draw(10, 10, 50);

        CircleFlyweight blueCircle = ShapeFactory.getCircle("blue");
        blueCircle.draw(20, 20, 60);

        CircleFlyweight anotherRedCircle = ShapeFactory.getCircle("red");
        anotherRedCircle.draw(30, 30, 40);
    }
}





  • 结构
    image




posted @ 2023-11-25 04:50  qwertzxc  阅读(2)  评论(0)    收藏  举报