文档章节

设计模式 之 享元模式

GMarshal
 GMarshal
发布于 06/24 09:17
字数 579
阅读 7
收藏 0
点赞 0
评论 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
粉丝 10
博文 29
码字总数 18830
作品 0
南京
程序员
JavaScript 中常见设计模式整理

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

牧云云
05/18
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
java设计模式-- 单例模式

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

爱学习的逃课君
2014/11/27
0
0
(目录)设计模式(可复用面向对象软件的基础)

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

chapin
2015/01/13
0
0
Java之23种设计模式解析(二)

B、结构模式(7 种) 我们接着讨论设计模式,上篇文章我讲完了 5 种创建型模式,这章开始,我将讲下 7 种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模...

wersdffg
2015/02/15
0
0
设计模式Java Design Pattern-工厂方法模式FactoryMethod

我的博客 一、 设计模式的分类 大体可以分为三类: 创建型模式(5个) 单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式 结构性模式(7个) 适配器模式、装饰器模式、代理模式、...

勇敢写信
03/22
0
0
JavaScript常用设计模式

设计模式 设计模式是一种在长时间的经验与错误中总结出来可服用的解决方案。 设计模式主要分为3类: 创建型设计模式:专注于处理对象的创建 Constructor构造器模式,Factory工厂模式,Singl...

a独家记忆
07/13
0
0
23种JAVA设计模式(3)-结构模式

B、结构模式(7种) 我们接着讨论设计模式,上篇文章我讲完了5种创建型模式,这章开始,我将讲下7种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。...

Mr_蜗牛
2015/04/15
0
0
设计模式笔录(二),设计模式有哪些

本人出道5年,学习、编程、再学习、再编程一路走过,只是在笔和纸留下些脚印,实感惭愧。现开始把自己学习到的心得,实践中的体会,一一贴在互联网上,大家互相学习、探讨,寻找一些技术朋友...

方旭
2011/03/31
0
0
小菜学设计模式——设计模式总结之结构型

1、设计模式总结 设计模式总共23个,但是常用的不到10个,下面就把这23个设计模式进行整理归类,具体如下: 1)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型...

learn_more
2015/07/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

NNS拍卖合约

前言 关于NNS的介绍,这里就不多做描述,相关的信息可以查看NNS的白皮书http://doc.neons.name/zh_CN/latest/nns_background.html。 首先nns中使用的竞价货币是sgas,关于sgas介绍可以戳htt...

红烧飞鱼
37分钟前
0
0
从MySQL全备文件中恢复单个库或者单个表

从MySQL全备文件中恢复单个库或者单个表 提取建库语句 sed -n '/^-- Current Database: db_cms/,/^-- Current Database: `/p' backup.sql > db_cms.sql & 提取ddl sed -e'/./{H;$!d;}' -e ......

yysue
今天
0
0
Java IO类库之管道流PipeInputStream与PipeOutputStream

一、java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的...

老韭菜
今天
0
0
用Python绘制红楼梦词云图,竟然发现了这个!

Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具,下面我们来看看如何使用Python,来读红楼梦,绘制小...

猫咪编程
今天
0
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
今天
1
0
protobuf学习笔记

相关文档 Protocol buffers(protobuf)入门简介及性能分析 Protobuf学习 - 入门

OSC_fly
昨天
0
0
Mybaties入门介绍

Mybaties和Hibernate是我们在Java开发中应用的比较多的两个ORM框架。当然,目前Mybaties正在慢慢取代Hibernate,这是因为相比较Hibernate而言Mybaties性能更好,响应更快,更加灵活。我们在开...

王子城
昨天
2
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
昨天
1
0
流利阅读笔记33-20180722待学习

黑暗中的生物:利用奇技淫巧快活生存 Daniel 2018-07-22 1.今日导读 如果让你在伸手不见五指的黑暗当中生存,你能熬过几天呢?而大千世界,无奇不有。在很多你不知道的角落,有些生物在完全黑...

aibinxiao
昨天
6
0
Hystrix降级逻辑中如何获取触发的异常

通过之前Spring Cloud系列教程中的《Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)》一文,我们已经知道如何通过Hystrix来保护自己的服务不被外部依赖方拖垮的情况。但是实际...

程序猿DD
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部