享元模式浅谈

121 阅读2分钟

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」。

一、什么是享元模式

享元模式:是一种结构型设计模式,享元模式会尝试使用已经创建的对象,如果没有,再创建新对象。主要作用是减少创建对象的数量,达到减少内存占用提高性能的作用。java中很多地方都可以见到它的身影,如数据库连接池,还有java中的String,String对象创建时会先尝试从缓存中获取,没有再进行对象的创建。

二、享元模式怎么实现

public interface Cup003 {


    void  show();
}

抽象享元,杯子。

@Data
public class Glass003 implements Cup003 {
    private String color;

    private Integer price;

    @Override
    public void show() {
        System.out.println("这是一个杯子,collor:" + color + ",price:" + price);
    }
}

具体享元,具体的玻璃杯,color是内部状态,price为外部状态。

public class CupFactory {
    private final static Map<String,Cup003> map = new HashMap<>();

    public static Cup003 getCup(String color){
        Cup003 cup003 = map.get(color);
        if (cup003==null){
            Glass003 glass = new Glass003();
            glass.setColor(color);
            map.put(color,glass);
            cup003 = glass;
            System.out.println("创建一个杯子color:"+color);
        }
        return cup003;
    }
}

杯子工厂,创建对象时会提示。

public class CupTest {
    private static final String colors[] =
            { "Red", "Green", "Blue", "White", "Black" };
    public static void main(String[] args) {
        for (int i = 0; i < 30; i++) {
            Glass003 glass = (Glass003)CupFactory.getCup(getColor());
            glass.setPrice(i);
            glass.show();
        }
    }

    private static String getColor(){
        return colors[(int) (Math.random()*colors.length)];
    }
}

可以看到,总共需要30个对象,但只创建了5次对象,大大减少了对象的创建数量。 image.png

三、总结

享元模式的角色:

  1. flyweight:抽象享元,规定享元对象需要实现的接口。
  2. concreateFlyweight:具体享元对象,抽象享元的实现。
  3. flyweightFactory:享元工厂,负责管理和创建享元对象,必须保证享元对象可以被系统适当的共享。 优点:减少了对象的创建,从而降低了内存的消耗,实现了系统性能的提升。

缺点:提高了系统的复杂度。

使用场景:系统中有大量相似的对象,或者需要使用缓冲池的时候。

其它概念:

  1. 内部状态:在享元对象内部不随外界环境而改变的共享部分。
  2. 外部状态:随着外部环境的改变而改变,不能共享的状态就是外部状态。