文档章节

设计模式 之 享元模式

GMarshal
 GMarshal
发布于 06/24 09:17
字数 579
阅读 8
收藏 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
粉丝 11
博文 44
码字总数 34592
作品 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 Design Pattern-工厂方法模式FactoryMethod

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

勇敢写信
03/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何通过 J2Cache 实现分布式 session 存储

做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在...

红薯
今天
3
0
C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
今天
3
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
今天
2
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
今天
3
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部