# 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