原文地址:http://leihuang.org/2014/12/09/flyweight/
Structural 模式 如何设计物件之间的静态结构,如何完成物件之间的继承、实 现与依赖关系,这关乎着系统设计出来是否健壮(robust):像是易懂、易维护、易修改、耦合度低等等议题。Structural 模式正如其名,其分类下的模式给出了在不同场合下所适用的各种物件关系结构。
享元模式用于降低对象的创建数量,提升程序性能.java中String就是利用了享元模式,就是如果对象内容相同时就不创建新的对象,如果不存在与之相同内容的对象时,才创建一个新的对象.
String str1 = "abc" ;
String str2 = "abc" ;
System.out.println(str1==str2) ;
上面这段代码输出true,因为String就是利用了享元模式.
下面我们来实现一个享元模式,一个形状接口Shape,长方形Rectangle实现Shape接口,我们让客户端创造不同颜色的长方形,相同颜色的记为内容相同.类结构图如下:
Shape 接口
public interface Shape {
public void draw() ;
}
Rectangle 类
public class Rectangle implements Shape {
private int width, height;
private String color;
public Rectangle(String color) {
this.color = color;
}
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
@Override
public void draw() {
System.out.println("width:" + width + " height:" + height + " color:"
+ color);
}
}
ShapeFactory 类
public class ShapeFactory {
private static HashMap<String,Shape> hs = new HashMap<String,Shape>() ;
public static Shape getShape(String color){
Shape shape = hs.get(color);
if(shape==null){
shape = new Rectangle(color) ;
hs.put(color, shape) ;
}
return shape;
}
public static int size(){
return hs.size() ;
}
}
Client 类
public class Client {
private static String[] colors = { "red", "blue", "yellow", "green",
"black" };
public static void main(String[] args) {
Rectangle rectangle = null ;
for (int i=0;i<20;i++) {
rectangle = (Rectangle) ShapeFactory.getShape(getRandomColor());
rectangle.setHeight(i);
rectangle.setWidth(i);
rectangle.draw();
}
System.out.println(ShapeFactory.size()) ; //always 5
}
private static String getRandomColor() {
return colors[(int) (Math.random() * colors.length)];
}
}