文档章节

设计模式 之 享元模式

GMarshal
 GMarshal
发布于 06/24 09:17
字数 579
阅读 9
收藏 0

设计模式 之 享元模式

定义

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

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

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

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

场景

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

代码

接口类

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

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

输入图片说明

© 著作权归作者所有

共有 人打赏支持
GMarshal
粉丝 15
博文 53
码字总数 42244
作品 0
南京
程序员
私信 提问
JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中...

牧云云
05/18
0
0
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
11/06
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
(目录)设计模式(可复用面向对象软件的基础)

本系列“设计模式”博客使用Golang语言实现算法。所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍...

chapin
2015/01/13
0
0
java设计模式-- 单例模式

在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。 java的设计模式大致可以分为3大类,23种设计模式。 其中,创建型模式有5种:单例模式、建造者模式、...

爱学习的逃课君
2014/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JVisualVM监控远程jar包运行情况

1.准备一个jar文件,需要放到服务器上有运行 tuyou-user-SNAPSHOT-0.0.1.jar 2.上传至服务器,启动jar文件: nohup java -Djava.rmi.server.hostname=192.168.104.135 -Dcom.sun.management...

日落北极
16分钟前
2
0
ReentrantReadWriteLock 源码

ReentrantReadWriteLock有五个内部类,五个内部类之间也是相互关联的。内部类的关系如下图所示。 如上图所示,Sync继承自AQS、NonfairSync继承自Sync类、FairSync继承自Sync类;ReadLock实现...

狼王黄师傅
18分钟前
3
0
详解netty原理分析

Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动...

小刀爱编程
24分钟前
2
0
Vue props用法小结

Vue props用法详解 组件接受的选项之一 props 是 Vue 中非常重要的一个选项。父子组件的关系可以总结为: props down, events up 父组件通过 props 向下传递数据给子组件;子组件通过 events...

peakedness丶
28分钟前
3
0
pycharm 教程(一)安装和首次使用

pycharm 教程(一)安装和首次使用 2017-12-05 09:19 by 菜鸟飞呀飞, 134207 阅读, 1 评论, 收藏, 编辑 PyCharm 是我用过的python编辑器中,比较顺手的一个。而且可以跨平台,在macos和windo...

linjin200
29分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部