设计模式 之 享元模式

原创
2018/06/24 09:17
阅读数 98

设计模式 之 享元模式

定义

使用共享技术来有效地支持大量细粒度对象的复用

关键点:防止类多次创建,造成内存溢出;

使用享元模式来将内部状态与外部状态进行分离,在循环创建对象的环境下,通过内部状态获取已经存在的对象,并赋值外部状态。

  • 内部状态:在享元对象内部不随外界环境改变而改变的共享部分。
  • 外部状态:随着环境的改变而改变,不能够共享的状态就是外部状态。

场景

商品分为 连衣裙 与 牛仔裤 每种类型的商品,可以根据尺寸生成不同价格套餐商品,并销售

代码

接口类

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://gitee.com/gmarshal/foruo-learn-java/tree/master/src/main/java/com/foruo/learn/designmode/flyweight

博客

https://my.oschina.net/gmarshal/blog/1834662

欢迎关注我的个人微信订阅号:(据说这个头像程序猿专用)

输入图片说明

展开阅读全文
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部