「这是我参与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次对象,大大减少了对象的创建数量。
三、总结
享元模式的角色:
- flyweight:抽象享元,规定享元对象需要实现的接口。
- concreateFlyweight:具体享元对象,抽象享元的实现。
- flyweightFactory:享元工厂,负责管理和创建享元对象,必须保证享元对象可以被系统适当的共享。 优点:减少了对象的创建,从而降低了内存的消耗,实现了系统性能的提升。
缺点:提高了系统的复杂度。
使用场景:系统中有大量相似的对象,或者需要使用缓冲池的时候。
其它概念:
- 内部状态:在享元对象内部不随外界环境而改变的共享部分。
- 外部状态:随着外部环境的改变而改变,不能共享的状态就是外部状态。