享元模式
定义: 使用共享对象有效地支持大量细粒度的对象.
享元模式是池技术的重要实现方式,它可以减少应用程序创建的对象,降低程序内存的占用,提高程序的性能.
使用场景:
- 系统中存在大量的相似对象.
- 需要缓冲池的场景.
举个例子吧:
//抽象享元角色是一个商品接口,它定义了showGoodsPrice方法来展示商品价格
public interface IGoods {
public void showGoodsPrice(String name);
}
//定义类Goods 它是吸纳IGoods 接口,并是实现了 showGoodsPrice方法
public class Goods implements IGoods{
private String name;//名称
private String version;// 版本
public Goods(String name) {
this.name = name;
}
@Override
public void showGoodsPrice(String version) {
if (version.equals("32G")){
System.out.println("价格为5199元");
}else if (version.equals("128G")){
System.out.println("价格为5999元");
}
}
}
//享元工厂
public class GoodsFactory {
private static Map<String ,Goods> pool = new HashMap<String ,Goods>();
public static Goods getGoods(String name){
if (pool.containsKey(name)){
System.out.println("使用缓存,key为:"+name);
return pool.get(name);
}else {
Goods goods = new Goods(name);
pool.put(name,goods);
System.out.println("创建商品,key 为:"+name);
return goods;
}
}
}
Client 使用
public static void main(String[] args) {
Goods goods1 = GoodsFactory.getGoods("iphone7");
goods1.showGoodsPrice("32G");
Goods goods2 = GoodsFactory.getGoods("iphone7");
goods2.showGoodsPrice("32G");
Goods goods3 = GoodsFactory.getGoods("iphone7");
goods3.showGoodsPrice("128G");
}
打印出的结果是:
创建商品,key 为:iphone7
价格为5199元
使用缓存,key为:iphone7
价格为5199元
使用缓存,key为:iphone7
价格为5999元
从输出结果可以看出,只有第一次是创建 Goods 对象,后面因为 key 值相同,所以均使用了对象池中的 Goods 对象.
网友评论