定義
使用場景
- 大範圍使用,可以使用該模式達到共享。
- 舉例:數據庫連接池、線程池等。
UML圖
代碼實現
public class Flyweight {
private String name;
public Flyweight(String name) {
this.name = name;
}
public void method(){
System.out.println("共享對象的方法");
}
}
public class FlyweightFactory {
private Map<String,Flyweight> flyweightMap = new HashMap<>();
private static FlyweightFactory factory = new FlyweightFactory();
private FlyweightFactory(){}
public static FlyweightFactory getFacttory(){
return factory;
}
public synchronized Flyweight getFlyweight(String key){
Flyweight flyweight = flyweightMap.get(key);
if(flyweight == null){
flyweight = new Flyweight(key);
flyweightMap.put(key,flyweight);
}
return flyweight;
}
public int size(){
return flyweightMap.size();
}
}
public class Client {
public static void main(String[] args) {
FlyweightFactory factory = FlyweightFactory.getFacttory();
Flyweight flyweight = factory.getFlyweight("共享");
flyweight.method();
factory.getFlyweight("共享2");
factory.getFlyweight("共享");
int size = factory.size();
}
}
總結
- 通過儘量共享實例來避免 new 出實例。
- 減少new 實例,達到減少對資源的佔用,通過共享直接從池中獲取,不需創建,大大提升程序效率。