享元模式-flyweight
故事:
美女喜欢画画,彩色水笔是可以重复使用的。
土味情话:
享元模式其实挺好记忆的,就是new一些对象,放到Map里面。需要使用这个对象的时候,就从Map里面获取而不是自己重新new一个。数据库连接池就是享元模式的很好的例子。
伪代码
下面用彩色笔举例,享元模式结合单例模式以及工厂方法模式举例
/**
* 画笔
* @author 康康的远方
* @date 2021/4/9
*/
public class Pen {
private String color;
public Pen(String color) {
this.color = color;
}
}
/**
* @author 康康的远方
* @date 2021/4/9
*/
public class PenFactory {
private Map<String, Pen> map = new HashMap<>();
private static final PenFactory penFactory = new PenFactory();
private PenFactory() {
}
/**
* 单例模式
*/
public static PenFactory getInstance() {
return penFactory;
}
/**
* 工厂和享元模式结合
*/
public synchronized Pen getPen(String color) {
Pen pen = map.get(color);
if (null == pen) {
pen = new Pen(color);
map.put(color, pen);
}
return pen;
}
}
public class FlyWeigthtTest {
public static void main(String[] args) {
Pen red = PenFactory.getInstance().getPen("red");
Pen green = PenFactory.getInstance().getPen("green");
Pen red2 = PenFactory.getInstance().getPen("red");
System.out.println(red == green);//false
System.out.println(red == red2);//true
}
}
总结:
优点:就是不用重新new对象,提高了获得对象的速度。像HTTP连接,数据库的连接都应该使用连接池,如果我们每次创建新的对象,不但会花费时间,如果不能即时回收不用的对象,还会造成服务器连接数过多。
缺点:享元模式的对象不会被JVM回收,会一直存在内存中,所以我们要设置合适的对象数量,太多了就浪费了内存。