相关文章
【合集】Java设计模式
两种状态
享元模式的实现要领就是区分应用中的这两种状态,并将外部状态外部化。
-
内部状态,不随环境改变可共享
-
外部状态,随环境改变不可共享。
享元模式
抽象享元
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
|