Featured image of post Java设计模式-享元模式Flyweight

Java设计模式-享元模式Flyweight

相关文章

【合集】Java设计模式

两种状态

享元模式的实现要领就是区分应用中的这两种状态,并将外部状态外部化。

  1. 内部状态,不随环境改变可共享

  2. 外部状态,随环境改变不可共享。

享元模式

抽象享元

1
2
3
4
5
6
public static abstract class AbstractBox {
    public abstract String getShape();
    public void display(String color) {
        System.out.println("方块形状:" + getShape() + ", 颜色:" + color);
    }
}

具体享元

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
public static class IBox extends AbstractBox {
    public String getShape() {
        return "I";
    }
}
public static class LBox extends AbstractBox {
    public String getShape() {
        return "L";
    }
}
public static class OBox extends AbstractBox {
    public String getShape() {
        return "O";
    }
}

享元工厂

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
public static class BoxFactory {
    private static final BoxFactory factory = new BoxFactory();
    private final HashMap<String, AbstractBox> map = new HashMap<>();
    private BoxFactory() {
        map.put("I", new IBox());
        map.put("L", new LBox());
        map.put("O", new OBox());
    }
    public static BoxFactory getInstance() {
        return factory;
    }
    public AbstractBox getShape(String name) {
        return map.get(name);
    }
}

客户端调用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
AbstractBox box1 = BoxFactory.getInstance().getShape("I");
box1.display("灰色"); // 方块形状:I, 颜色:灰色

AbstractBox box2 = BoxFactory.getInstance().getShape("L");
box2.display("绿色"); // 方块形状:L, 颜色:绿色

AbstractBox box3 = BoxFactory.getInstance().getShape("O");
box3.display("灰色"); // 方块形状:O, 颜色:灰色

AbstractBox box4 = BoxFactory.getInstance().getShape("O");
box4.display("红色"); // 方块形状:O, 颜色:红色

System.out.println("box1和box2对象是否同一个对象?" + (box1 == box2)); // false
System.out.println("box3和box4对象是否同一个对象?" + (box3 == box4)); // true

应用

Integer

基本类型在Java编译的时编译器会默认调用valueOf进行装箱{@link Integer#valueOf(int)},维护了一个{@link Integer.IntegerCache}的享元池

1
2
3
4
5
6
7
Integer i1 = 127;
Integer i2 = 127;
System.out.println("i1和i2对象是否同一个对象?" + (i1 == i2)); // true

Integer i3 = 128;
Integer i4 = 128;
System.out.println("i3和i4对象是否同一个对象?" + (i3 == i4)); // false
皖ICP备2024056275号-1
发表了78篇文章 · 总计149.56k字
本站已稳定运行