定义
使用场景
- 大范围使用,可以使用该模式达到共享。
- 举例:数据库连接池、线程池等。
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 实例,达到减少对资源的占用,通过共享直接从池中获取,不需创建,大大提升程序效率。