# 23种设计模式-享元模式
# 1.享元模式
运用共享技术有效地支持大量细粒度的对象。
# 优缺点
# 优点:
极大减少系统中对象的个数 由于使用了外部状态,外部状态相对独立,不会影响到内部状态,所以享元模式使得享元对象能够在不同的环境被共享。
# 缺点:
由于享元模式需要区分外部状态和内部状态,使得应用程序在某种程度上来说更加复杂化了。 为了使对象可以共享,需要将享元对象的状态外部化,而读取外部状态使得运行时间变长。
# 使用场景
如果系统中存在大量的相同或者相似的对象,由于这类对象的大量使用,会造成系统内存的耗费,可以使用享元模式来减少系统中对象的数量。
对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。
# 实现方式
# 形状类:Shape.java。它是抽象类,只有一个绘制图形的抽象方法。
public abstract class Shape {
public abstract void draw();
}
# 绘制圆形的具体类。Circle.java:
public class Circle extends Shape{
private String color;
public Circle(String color){
this.color = color;
}
public void draw() {
System.out.println("画了一个" + color +"的圆形");
}
}
# 享元工厂类。FlyweightFactory:
//核心类
public class FlyweightFactory{
static Map<String, Shape> shapes = new HashMap<String, Shape>();
public static Shape getShape(String key){
Shape shape = shapes.get(key);
//如果shape==null,表示不存在,则新建,并且保持到共享池中
if(shape == null){
shape = new Circle(key);
shapes.put(key, shape);
}
return shape;
}
public static int getSum(){
return shapes.size();
}
}
# 测试类
public class Client {
public static void main(String[] args) {
Shape shape1 = FlyweightFactory.getShape("红色");
shape1.draw();
Shape shape2 = FlyweightFactory.getShape("灰色");
shape2.draw();
Shape shape3 = FlyweightFactory.getShape("绿色");
shape3.draw();
Shape shape4 = FlyweightFactory.getShape("红色");
shape4.draw();
Shape shape5 = FlyweightFactory.getShape("灰色");
shape5.draw();
Shape shape6 = FlyweightFactory.getShape("灰色");
shape6.draw();
System.out.println("一共绘制了"+FlyweightFactory.getSum()+"中颜色的圆形");
}
}
参考博客:https://blog.csdn.net/a745233700/article/details/83661080