享元模式

享元模式(Flyweight Pattern)属于结构型模式。主要用于减少创建的对象数量,来减少内存占用,提高性能。用法是将很多对象分为几类,确定每个类对象的唯一标示,可以用HashMap存储。

简单的demo:
画很多圆的时候,不需要每个圆形都创建一个对象,假设创建不同颜色的画笔是一个很大的开销,就可以以颜色进行分类,一种颜色的圆形只创建一个对象。

画图形的接口:

public interface Shape {
    void draw();
}

圆形的类

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 setCircleCenter(int x, int y) {
        this.x = x;
        this.y = y;
    }

    // 半径可以动态设置
    public void setRadius(int radius) {
        this.radius = radius;
    }

    @Override
    public void draw() {
        System.out.println("画了一个圆: 颜色是" + color + ",圆心是(" + x + "," + y + "),半径是" + radius);
    }
}

创建圆形的类:

public class CircleFactory {
    // 圆的颜色
    public static final String colors[] = {"红色", "蓝色", "绿色", "白色", "黑色"};
    // 通过HashMap缓存创建的圆形
    private static final HashMap<String, Shape> circleMap = new HashMap<>();

    // 获取圆形对象
    public static Shape getShape(String color) {
        Circle circle = (Circle) circleMap.get(color);
        if (circle == null) {
            circle = new Circle(color);
            circleMap.put(color, circle);
            System.out.println("画了一个" + color + "的圆,圆心是(" + x + "," + y + "),半径是" + radius);
        }
        return circle;
    }
}

调用:

for (int i = 0; i < 8; i++) {
    String color = CircleFactory.colors[(int) (Math.random() * CircleFactory.colors.length)];
    Circle circle = (Circle) CircleFactory.getShape(color);
    circle.setCircleCenter((int) (Math.random() * 100), (int) (Math.random() * 100));
    circle.setRadius((int) (Math.random() * 100));
    circle.draw();
}

输出结果是:

创建一个红色的圆形对象
画了一个红色的圆,圆心是(62,8),半径是10
画了一个红色的圆,圆心是(30,5),半径是37
创建一个白色的圆形对象
画了一个白色的圆,圆心是(92,76),半径是73
创建一个绿色的圆形对象
画了一个绿色的圆,圆心是(3,99),半径是63
画了一个红色的圆,圆心是(77,46),半径是11
画了一个绿色的圆,圆心是(54,46),半径是76
创建一个蓝色的圆形对象
画了一个蓝色的圆,圆心是(56,18),半径是50
画了一个蓝色的圆,圆心是(51,19),半径是47
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值