2019-11-02 22:11:39 +08:00
|
|
|
|
## 享元(Flyweight)
|
|
|
|
|
|
|
|
|
|
### Intent
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
利用共享的方式来支持大量细粒度的对象,这些对象一部分内部状态是相同的。
|
|
|
|
|
|
|
|
|
|
### Class Diagram
|
|
|
|
|
|
|
|
|
|
- Flyweight:享元对象
|
|
|
|
|
- IntrinsicState:内部状态,享元对象共享内部状态
|
|
|
|
|
- ExtrinsicState:外部状态,每个享元对象的外部状态不同
|
|
|
|
|
|
2019-12-06 10:11:23 +08:00
|
|
|
|
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/5f5c22d5-9c0e-49e1-b5b0-6cc7032724d4.png"/> </div><br>
|
2019-11-02 22:11:39 +08:00
|
|
|
|
|
|
|
|
|
### Implementation
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
public interface Flyweight {
|
|
|
|
|
void doOperation(String extrinsicState);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
public class ConcreteFlyweight implements Flyweight {
|
|
|
|
|
|
|
|
|
|
private String intrinsicState;
|
|
|
|
|
|
|
|
|
|
public ConcreteFlyweight(String intrinsicState) {
|
|
|
|
|
this.intrinsicState = intrinsicState;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void doOperation(String extrinsicState) {
|
|
|
|
|
System.out.println("Object address: " + System.identityHashCode(this));
|
|
|
|
|
System.out.println("IntrinsicState: " + intrinsicState);
|
|
|
|
|
System.out.println("ExtrinsicState: " + extrinsicState);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
public class FlyweightFactory {
|
|
|
|
|
|
|
|
|
|
private HashMap<String, Flyweight> flyweights = new HashMap<>();
|
|
|
|
|
|
|
|
|
|
Flyweight getFlyweight(String intrinsicState) {
|
|
|
|
|
if (!flyweights.containsKey(intrinsicState)) {
|
|
|
|
|
Flyweight flyweight = new ConcreteFlyweight(intrinsicState);
|
|
|
|
|
flyweights.put(intrinsicState, flyweight);
|
|
|
|
|
}
|
|
|
|
|
return flyweights.get(intrinsicState);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
public class Client {
|
|
|
|
|
|
|
|
|
|
public static void main(String[] args) {
|
|
|
|
|
FlyweightFactory factory = new FlyweightFactory();
|
|
|
|
|
Flyweight flyweight1 = factory.getFlyweight("aa");
|
|
|
|
|
Flyweight flyweight2 = factory.getFlyweight("aa");
|
|
|
|
|
flyweight1.doOperation("x");
|
|
|
|
|
flyweight2.doOperation("y");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```html
|
|
|
|
|
Object address: 1163157884
|
|
|
|
|
IntrinsicState: aa
|
|
|
|
|
ExtrinsicState: x
|
|
|
|
|
Object address: 1163157884
|
|
|
|
|
IntrinsicState: aa
|
|
|
|
|
ExtrinsicState: y
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### JDK
|
|
|
|
|
|
|
|
|
|
Java 利用缓存来加速大量小对象的访问时间。
|
|
|
|
|
|
|
|
|
|
- java.lang.Integer#valueOf(int)
|
|
|
|
|
- java.lang.Boolean#valueOf(boolean)
|
|
|
|
|
- java.lang.Byte#valueOf(byte)
|
|
|
|
|
- java.lang.Character#valueOf(char)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div align="center"><img width="320px" src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/githubio/公众号二维码-2.png"></img></div>
|