设计模式之享元模式的学习思考

享元模式,顾名思义,对对象的分享。其主要用于减少创建对象的数量,以减少内存占用和性能提高。
该模式属于结构型设计模式。

实现途径:

  • 通过hashmap
  • 通过工厂模式
  • 通过多态

设计:

  • 通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式。

代码:

import java.util.HashMap;
interface Shape{
    void draw();
}

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

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

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

    @Override
    public void draw() {
        System.out.println("Circle:Draw()[Color"+color+",x:"+x+",y:"+y+",radius:"+radius);
    }

}

class ShapeFactory{
    private static final HashMap<String,Shape>circleMap=new HashMap();

    public static Shape getCircle(String color){
        Circle circle=(Circle)circleMap.get(color);
        if(circle==null){
            circle=new Circle(color);
            circleMap.put(color, circle);
            System.out.println("Creating circle of color:"+color);
        }
        return circle;
    }
}
public class FlyweightPatternDemo {
    private static final String colors[]={"Red","Green","Blue","White","Black"};

    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.draw();
        }

    }

    private static int getRandomY() {
        return (int) (Math.random()*100);
    }

    private static int getRandomX() {
        return (int) (Math.random()*100);
    }

    private static String getRandomColor() {

        return colors[(int) (Math.random()*colors.length)];
    }

}

输出:

Creating circle of color:Red
Circle:Draw()[ColorRed,x:68,y:49,radius:0
Creating circle of color:Black
Circle:Draw()[ColorBlack,x:13,y:64,radius:0
Creating circle of color:Blue
Circle:Draw()[ColorBlue,x:87,y:58,radius:0
Creating circle of color:White
Circle:Draw()[ColorWhite,x:98,y:89,radius:0
Creating circle of color:Green
Circle:Draw()[ColorGreen,x:75,y:92,radius:0
Circle:Draw()[ColorGreen,x:98,y:90,radius:0
Circle:Draw()[ColorBlack,x:97,y:13,radius:0
Circle:Draw()[ColorWhite,x:81,y:69,radius:0
Circle:Draw()[ColorBlack,x:12,y:23,radius:0
Circle:Draw()[ColorBlue,x:57,y:50,radius:0
Circle:Draw()[ColorGreen,x:43,y:82,radius:0
Circle:Draw()[ColorBlue,x:68,y:80,radius:0
Circle:Draw()[ColorBlue,x:76,y:58,radius:0
Circle:Draw()[ColorRed,x:6,y:12,radius:0
Circle:Draw()[ColorBlue,x:69,y:75,radius:0
Circle:Draw()[ColorWhite,x:74,y:11,radius:0
Circle:Draw()[ColorBlue,x:18,y:97,radius:0
Circle:Draw()[ColorWhite,x:91,y:94,radius:0
Circle:Draw()[ColorBlue,x:46,y:5,radius:0
Circle:Draw()[ColorGreen,x:99,y:92,radius:0

总结:虽然实现的过程比较简单,但是其思想还是需要好好体会,代码复用的典型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值