享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象。用于减少创建对象的数量,以减少内存占用和提高性能。
一、享元模式
在软件开发过程中,如果有使用大量相同的对象,只要共享一个就可以,这就是享元模式,减少了不必要的内存消耗,其UML图如下所示:
享元模式由以下部分组成:
抽象享元类(Flyweight): 所有具体享元类的超类或者接口,通过这个接口,Flyweight可以接受并作用于外部专题。
具体享元类(ConcreteFlyweight):指定内部状态,为内部状态增加存储空间。
享元工厂类(FlyweightFactory):用来创建并管理Flyweight对象,它主要用来确保合理地共享Flyweight,当用户请求一个Flyweight时,FlyweightFactory就会提供一个已经创建的Flyweight对象或者新建一个(如果不存在)。
二、案例分析
我们以画出不同颜色的圆形为例,简单分析一下享元模式。
抽象享元类–Shape
interface Shape{
public void operation();
}
具体享元类:
class Circle implements Shape{
private String color;
public Circle(String color) {
this.color = color;
}
@Override
public void operation() {
System.out.println("我是"+color+"的圆形。");
}
}
享元工厂类:
class ShapeFactory{
private static final HashMap<String,Shape> Circles= new HashMap<>();
public static Shape getCircle(String color){
Circle c= (Circle)Circles.get(color);
if(c == null){
c = new Circle(color);
Circles.put(color,c);
c.operation();
}
return c;
}
public static int getMapSize(){
return Circles.size();
}
}
客户端调用:
public class Test {
public static void main(String[] args) {
ShapeFactory.getCircle("红色");
ShapeFactory.getCircle("蓝色");
ShapeFactory.getCircle("绿色");
ShapeFactory.getCircle("绿色");
ShapeFactory.getCircle("红色");
ShapeFactory.getCircle("红色");
System.out.println("对象池的长度为"+ShapeFactory.getMapSize());
}
}
运行结果(代码亲测,可以通过):
代码地址:Flyweight
如上例所示,使用工厂模式配合,在这个对象池(HashMap)中,第一次使用的时候创建对象,之后每次都是在调用这个对象,而不会重新创建。
三、模式结语
享元模式的优点:
享元模式的优点在于它能够极大的减少系统中对象的个数。
享元模式由于使用了外部状态,外部状态相对独立,不会影响到内部状态,所以享元模式使得享元对象能够在不同的环境被共享。
享元模式的使用场景:
一个系统中存在大量的相同或者相似的对象,过量使用会造成系统内存的耗费,可以使用享元模式来减少系统中对象的数量。
对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。
欢迎大家评论留言,点击查看更多设计模式。