享元模式,顾名思义,对对象的分享。其主要用于减少创建对象的数量,以减少内存占用和性能提高。
该模式属于结构型设计模式。
实现途径:
- 通过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
总结:虽然实现的过程比较简单,但是其思想还是需要好好体会,代码复用的典型。