享元模式代码举例(java语言版)

前言:享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。(感觉是不是很像数据库连接池是这个模式的实现,但是请不要搞错了,数据库连接池不是享元模式的实现。数据库连接池其实代理模式实现的一种方式,在代码模式那篇博客里我会具体解释)

JAVA语言版享元模式

创建接口:

public interface Shape {
    void draw();
}

创建一个实现接口的pojo类:

public class Circle implements Shape {
    private UUID uuid;
    private String color;
    private int x;
    private int y;
    private int radius;

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

    public UUID getUuid() {
        return uuid;
    }

    public void setUuid(UUID uuid) {
        this.uuid = uuid;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getRadius() {
        return radius;
    }

    public void setRadius(int radius) {
        this.radius = radius;
    }

    @Override
    public void draw() {
        System.out.println("画圆:颜色:" + color + " x:" + x + " y:" + y + " radius:" + radius);
    }
}

创建工厂用来生产pojo类:

public class ShapeFactory {
    private static Map<String, Shape> shapeMap = new HashMap<>();

    public static Shape getCircle(String color){
        Circle circle =(Circle) shapeMap.get(color);
        if (circle==null){
            circle = new Circle(color);
            shapeMap.put(color,circle);
        }
        return circle;
    }
}

用FlyweightPatternDemo类演示享元模式

public class FlyweightPatternDemo {
    private static final String colors[] =
            { "红色", "绿色", "蓝色", "白色", "黑色" };

    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();
            System.out.println("圆的唯一标识uuid:"+circle.getUuid());
        }
    }

    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);
    }
}

输出结果:

画圆:颜色:红色 x:30 y:18 radius:100
圆的唯一标识uuid:81f1ad47-0734-4944-a4fc-4113e53b9bc7
画圆:颜色:白色 x:44 y:42 radius:100
圆的唯一标识uuid:48763653-546e-4d7e-9fe8-7a265d9276f3
画圆:颜色:白色 x:95 y:75 radius:100
圆的唯一标识uuid:48763653-546e-4d7e-9fe8-7a265d9276f3
画圆:颜色:蓝色 x:53 y:48 radius:100
圆的唯一标识uuid:7e059efc-e664-4448-99cd-a17332d5cfdc
画圆:颜色:红色 x:21 y:16 radius:100
圆的唯一标识uuid:81f1ad47-0734-4944-a4fc-4113e53b9bc7
画圆:颜色:绿色 x:81 y:99 radius:100
圆的唯一标识uuid:81133e4e-9eb1-43fe-9a5e-3d06e93f4341
画圆:颜色:红色 x:99 y:16 radius:100
圆的唯一标识uuid:81f1ad47-0734-4944-a4fc-4113e53b9bc7
画圆:颜色:黑色 x:29 y:80 radius:100
圆的唯一标识uuid:10c2b7a0-aef4-46f7-9451-e64935f49903
画圆:颜色:白色 x:32 y:62 radius:100
圆的唯一标识uuid:48763653-546e-4d7e-9fe8-7a265d9276f3
画圆:颜色:绿色 x:13 y:29 radius:100
圆的唯一标识uuid:81133e4e-9eb1-43fe-9a5e-3d06e93f4341
画圆:颜色:红色 x:45 y:17 radius:100
圆的唯一标识uuid:81f1ad47-0734-4944-a4fc-4113e53b9bc7
画圆:颜色:蓝色 x:45 y:76 radius:100
圆的唯一标识uuid:7e059efc-e664-4448-99cd-a17332d5cfdc
画圆:颜色:黑色 x:24 y:54 radius:100
圆的唯一标识uuid:10c2b7a0-aef4-46f7-9451-e64935f49903
画圆:颜色:蓝色 x:1 y:66 radius:100
圆的唯一标识uuid:7e059efc-e664-4448-99cd-a17332d5cfdc
画圆:颜色:红色 x:77 y:39 radius:100
圆的唯一标识uuid:81f1ad47-0734-4944-a4fc-4113e53b9bc7
画圆:颜色:绿色 x:98 y:62 radius:100
圆的唯一标识uuid:81133e4e-9eb1-43fe-9a5e-3d06e93f4341
画圆:颜色:绿色 x:53 y:43 radius:100
圆的唯一标识uuid:81133e4e-9eb1-43fe-9a5e-3d06e93f4341
画圆:颜色:红色 x:84 y:50 radius:100
圆的唯一标识uuid:81f1ad47-0734-4944-a4fc-4113e53b9bc7
画圆:颜色:蓝色 x:98 y:44 radius:100
圆的唯一标识uuid:7e059efc-e664-4448-99cd-a17332d5cfdc
画圆:颜色:黑色 x:30 y:87 radius:100
圆的唯一标识uuid:10c2b7a0-aef4-46f7-9451-e64935f49903

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值