设计模式 之 享元模式
定义
使用共享技术来有效地支持大量细粒度对象的复用
关键点:防止类多次创建,造成内存溢出;
使用享元模式来将内部状态与外部状态进行分离,在循环创建对象的环境下,通过内部状态获取已经存在的对象,并赋值外部状态。
- 内部状态:在享元对象内部不随外界环境改变而改变的共享部分。
- 外部状态:随着环境的改变而改变,不能够共享的状态就是外部状态。
场景
商品分为 连衣裙 与 牛仔裤 每种类型的商品,可以根据尺寸生成不同价格套餐商品,并销售
代码
接口类
public interface IGoods {
/**
* 销售
*/
void sell();
}
具体商品类
public class Goods implements IGoods {
/** 商品类型 */
private String type;
/** 尺寸 */
private String size;
/** 价格 */
private String price;
public Goods(String type){
this.type = type;
}
@Override
public void sell() {
// 这里输出了地址,由于判断对象有没有改变
System.out.println(this.toString()+" -> Goods{" +
"type='" + type + '\'' +
", size='" + size + '\'' +
", price='" + price + '\'' +
'}');
}
// getter、setter...
}
工厂类
public class GoodsFactory {
private static final Map<String,IGoods> goodsMap = new HashMap<>();
public static IGoods getGoods(String type){
Goods goods = (Goods)goodsMap.get(type);
if (goods==null) {
goods = new Goods(type);
goodsMap.put(type,goods);
}
return goods;
}
}
测试类
public static void main(String[] args){
String type = "dress";
Goods goods = (Goods)GoodsFactory.getGoods(type);
goods.setSize("10");
goods.setPrice("100");
goods.sell();
goods = (Goods)GoodsFactory.getGoods(type);
goods.setSize("11");
goods.setPrice("110");
goods.sell();
type = "jeans";
goods = (Goods)GoodsFactory.getGoods(type);
goods.setSize("30");
goods.setPrice("1200");
goods.sell();
goods = (Goods)GoodsFactory.getGoods(type);
goods.setSize("31");
goods.setPrice("1500");
goods.sell();
}
运行结果
com.foruo.learn.designmode.flyweight.Goods@2503dbd3 -> Shose{type='dress', size='10', price='100'}
com.foruo.learn.designmode.flyweight.Goods@2503dbd3 -> Shose{type='dress', size='11', price='110'}
com.foruo.learn.designmode.flyweight.Goods@4b67cf4d -> Shose{type='jeans', size='30', price='1200'}
com.foruo.learn.designmode.flyweight.Goods@4b67cf4d -> Shose{type='jeans', size='31', price='1500'}
可以发现,同一种type的对象并没有重新创建,这样就达到共享的目的。
码云
博客
https://my.oschina.net/gmarshal/blog/1834662
欢迎关注我的个人微信订阅号:(据说这个头像程序猿专用)