享元模式-Flyweight(Java实现)

享元模式-Flyweight

享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。

本文中的例子如下:

使用享元模式: 小明想看编程技术的书, 就到家里的书架上拿, 如果有就直接看, 没有就去买一本, 回家看. 看完了就放到家里的书架上, 以后再想看了直接就在书架上拿, 不需要再去买同样的这本书了.

不适用享元模式: 小明想看编程技术的书, 就去书店里买一本回家看, 买完后看完了, 书就不知道丢到了哪里去了. 下次想看的时候就找不到了, 还是得去书店里重新买......又得花钱....然而并不长记性, 这回买完了, 看完了, 又丢到一边...下次还是得再买...

 

Java中实例化一个对象 vs 小明买一本书

在Java中的实例化一个对象, 就像是在买一本书, Java中的对象会随着作用域的退出, 对象会失去引用, 过后就会被垃圾收集器标记, 进行回收.

就相当于小明买完了一本书, 书就丢到了一边, 妈妈收拾屋子就把这本书识别为了垃圾, 就给扔掉了. (被妈妈收走是被动导致的小明每次都重新买一本书, 也有可能小明主动地每次看书都重新买一本, 有钱任性...这种有钱人性的行为在编程语言里就是每次都new一个对象, 而从来不去考虑复用)

 

Java中把对象放进一个容器里进行维护 vs 小明看完书把书放到书架上 (下面的相同颜色表示相同的行为, 可以互相对照)

在Java中:   使用完一个临时实例化的对象后, 如果以后还想复用, 那么就可以放到一个容器里(对象管理器), 或者更直接的说就比如存到一个HashMap里, 需要用的时候以后从里面直接出来. 这样HashMap对实例化的对象持有引用, 就不会被GC了, 这样该对象就可以常驻内存, 可以复用了, 不用再实例化同样的一个对象了.

小明:    看完了一本书, 把书放到了书架上, 这样妈妈就知道这本书是小明需要的东西, 就不会把它当成垃圾来处理. 这样这本书就会一直在家里存在, 小明想看的时候, 就到家里的书架就可以看了, 不用再重新买同样的一本书了.

 

BooK接口

书的统一定义.书在本里子中是享元模式里被共享的对象. 应该被放到书架上复用, 而不是买次都重新买.

/*** 书的统一抽象, 书可以被读*/
public interface Book {void read();
}

HeadFirstJavaScript类

/*** <<HeadFirst JavaScript>>*/
public class HeadFirstJavaScript implements Book {@Overridepublic void read() {System.out.printf("这是一本<<HeadFirst JavaScript>>. (书的编号是:%s)\n", System.identityHashCode(this));}
}

KotlinInAction类

/*** <<Kotlin实战>>*/
public class KotlinInAction implements Book {@Overridepublic void read() {System.out.printf("这是一本<<Kotlin实战>>. (书的编号是:%s)\n", System.identityHashCode(this));}
}

PythonCookBook类

/*** <<Python编程手册>>*/
public class PythonCookBook implements Book {@Overridepublic void read() {System.out.printf("这是一本<<Python编程手册>>. (书的编号是:%s)\n", System.identityHashCode(this));}
}

BookFactory类

import java.util.EnumMap;
import java.util.Map;public class BookFactory {public enum BookType {PYTHON, JAVASCRIPT, KOTLIN}private final Map<BookType, Book> shelf;public BookFactory() {shelf = new EnumMap<>(BookType.class);}/*** 想读一本书的话就通过这里来get.* 如果书架里有, 那么就从书架里拿* 如果书架里没有, 那么就从书店买一本看, 然后放到书架上*/public Book getBook(BookType type) {Book book = shelf.get(type);if (book == null) {switch (type) {case PYTHON:book = new PythonCookBook();shelf.put(type, book);break;case JAVASCRIPT:book = new HeadFirstJavaScript();shelf.put(type, book);break;case KOTLIN:book = new KotlinInAction();shelf.put(type, book);break;default:break;}}return book;}
}

Main

运行/模拟场景

public class Main {public static void main(String[] args) {BookFactory bookFactory = new BookFactory();bookFactory.getBook(BookFactory.BookType.JAVASCRIPT).read();bookFactory.getBook(BookFactory.BookType.JAVASCRIPT).read();bookFactory.getBook(BookFactory.BookType.PYTHON).read();bookFactory.getBook(BookFactory.BookType.PYTHON).read();bookFactory.getBook(BookFactory.BookType.KOTLIN).read();bookFactory.getBook(BookFactory.BookType.KOTLIN).read();bookFactory.getBook(BookFactory.BookType.KOTLIN).read();// 书的编号一样, 说明书复用了, 而不是每次都买一个新的}
}

 结果如下 : 

如果对象不是共享的, 也就是非享元模式, 那么<<Kotlin实战>>的三次的书编号都会是不一样的, 因为每次看这本书, 都是新买的, 最终会导致买三次<<Kotlin实战>>这本书, 同样的书买三次多浪费啊.  而本文的例子使用了享元模式, 拿了三次<<Kotlin实战>>这本书, 每次编号都是1360875712, 说明从头到尾都是同一本书, 没有造成浪费.

转载于:https://www.cnblogs.com/noKing/p/9072910.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

013.Zabbix的Items(监控项)

一 Items简介 Items是从主机里面获取的所有数据&#xff0c;可以配置获取监控数据的方式、取值的数据类型、获取数值的间隔、历史数据保存时间、趋势数据保存时间、监控key的分组等。通常情况下item由key参数组成&#xff0c;如监控项中需要获取cpu信息&#xff0c;则需要一个对…

算法 --- 记一道面试dp算法题

题目: 给定一个数组(长度大于1),如下 let a [1,4,3,4,5] // 长度不确定,数值为整数要求写一个函数,返回该数组中,除本身数字之外其他元素的成积.即返回如下: // 过程[4*3*4*5, 1*3*4*5, 1*4*4*5, 1*4*3*5, 1*4*3*4] // 结果[240, 60, 80, 60, 48]题目要求不使用除法,且时间…

ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(10)之素材管理

源码下载地址&#xff1a;http://www.yealuo.com/Sccnn/Detail?KeyValuec891ffae-7441-4afb-9a75-c5fe000e3d1c 素材管理模块也是我们这个项目的核心模块&#xff0c;里面的增删查改都跟文章管理模块相同或者相似&#xff0c;唯一不同点可能是对附件的上传处理&#xff0c;但…

Git很简单--图解攻略

Git Git 是目前世界上最先进的分布式版本控制系统&#xff08;没有之一&#xff09;作用 源代码管理为什么要进行源代码管理? 方便多人协同开发方便版本控制Git管理源代码特点 1.Git是分布式管理.服务器和客户端都有版本控制能力,都能进行代码的提交、合并、. 2.Git会在根…

vc/vs开发的应用程序添加dump崩溃日志转

原贴地址&#xff1a;https://blog.csdn.net/wangkui1331/article/details/78029940 vc/vs开发的应用程序出现崩溃的时候&#xff0c;由于没有任何记录&#xff0c;导致开发人员很难追踪&#xff0c;但是添加dump文件后&#xff0c;就可以免除这些烦恼 1.添加方法 &#xff08;…

51 nod 1127最短的包含字符串(尺取法)

1127 最短的包含字符串 收藏关注给出一个字符串&#xff0c;求该字符串的一个子串S&#xff0c;S包含A-Z中的全部字母&#xff0c;并且S是所有符合条件的子串中最短的&#xff0c;输出S的长度。如果给出的字符串中并不包括A-Z中的全部字母&#xff0c;则输出No Solution。Input…

JSON 数据重复 出现$ref

JSONArray 类型 如果我们往里面add数据的时候 如果数据相同&#xff0c;那么就会被替换成 $ref: 也就是被简化了 因为数据一样所直接 指向上一条数据 循环引用&#xff1a;当一个对象包含另一个对象时&#xff0c;fastjson就会把该对象解析成引用。引用是通过$ref标示的&am…

Linux初学时的一些常用命令(4)

1. 磁盘 查看当前磁盘使用情况 df -h查看某个文件大小 du -sh 文件名 如果不输入文件名&#xff0c;默认是当前目录的所有文件之和&#xff0c;即当前目录大小 2. 系统内存 free参数详解&#xff1a;https://blog.csdn.net/loongshawn/article/details/51758116 3. CPU CPU 使用…

爬虫之拉勾网职位获取

重点在于演示urllib.request.Request()请求中各项参数的 书写格式 譬如&#xff1a; url data headers...Demo演示&#xff08;POST请求&#xff09;:import urllib.requestimport urllib.parseimport json, jsonpath, csvurl "https://www.lagou.com/jobs/positionAjax.…

小程序 --- 点击放大功能、获取位置信息、文字样式省略、页面跳转(navigateTo)

1. 点击放大功能的实现 需求: 点击轮播图中的图片会实现放大预览的功能。首先有轮播图的样式如下 <!-- pages/goods_detail/index.wxml --> <!-- 轮播图 --> <view class"detail_swiper"><swiperautoplaycircularindicator-dots><swip…

Axure实现多用户注册验证

*****多用户登录验证***** 一、&#xff08;常规想法&#xff09;方法&#xff1a;工作量较大&#xff0c;做起来繁琐 1、当用户名和密码相同时怎么区分两者&#xff0c;使用冒号和括号来区分&#xff1a; eg. (admin:123456)(123456:demo)(zhang:san);由此得出前面是括号后面是…

Maximum Xor Secondary(单调栈好题)

Maximum Xor Secondary CodeForces - 280B Bike loves looking for the second maximum element in the sequence. The second maximum element in the sequence of distinct numbers x1, x2, ..., xk (k > 1) is such maximum element xj, that the following inequa…

杂项-公司:唯品会

ylbtech-杂项-公司&#xff1a;唯品会唯品会公司成立于2008年08月&#xff0c;2012年3月23日登陆美国纽约证券交易所上市&#xff08;股票代码&#xff1a;VIPS&#xff09;。成为华南第一家在美国纽交所上市的电子商务企业。主营B2C商城唯品会名牌折扣网站是一家致力于打造中高…

Linux基本的操作

一、为什么我们要学习Linux 相信大部分人的PC端都是用Windows系统的&#xff0c;那我们为什么要学习Linux这个操作系统呢&#xff1f;&#xff1f;&#xff1f;Windows图形化界面做得这么好&#xff0c;日常基本使用的话&#xff0c;学习成本几乎为零。 而Linux不一样&#xff…

汇编语言 实验4

实验4 实验内容1&#xff1a;综合使用 loop,[bx]&#xff0c;编写完整汇编程序&#xff0c;实现向内存 b800:07b8 开始的连续 16 个 字单元重复填充字数据 0403H&#xff1b;修改0403H为0441H&#xff0c;再次运行 步骤1&#xff1a;在记事本中编写好temp.asm文件 步骤2&#x…

LDAP第三天 MySQL+LDAP 安装

https://www.easysoft.com/applications/openldap/back-sql-odbc.html OpenLDAP 使用 SQLServer 和 Oracle 数据库。 https://www.cnblogs.com/bigbrotherer/p/7251372.html          CentOS7安装OpenLDAPMySQLPHPLDAPadmin 1.安装和设置数据库 在CentOS7下&…

Myeclipse连接Mysql数据库时报错:Error while performing database login with the pro driver:unable...

driver template: Mysql connector/j&#xff08;下拉框进行选择&#xff09; driver name: 任意填&#xff0c;最好是数据库名称&#xff0c;方便查找 connection URL: jdbc:mysql://localhost:3306/programmableweb User name: 用户名 password: 密码 Driver jars: 添加jar包…

matlab --- 图像处理基础

MATLAB图像处理 1. 数字图像处理 参考 数字图像处理(Digital Image Processing)又称为计算机图像处理,是一种将图像信号数字化利用计算进行处理的过程。随着计算机科学、电子学和光学的发展,数字图像处理已经广泛的应用到诸多领域之中。本小节主要介绍图像的概念、分类和数字…

[python、flask] - POST请求

1. 微信小程序POST传递数据给flask服务器 小程序端 // 提交POST数据 import { request } from "../../request/index.js"async handleDetectionPoints() {let params {url: "/detect_points",data: {"points": arr,"img_name": thi…

[vue]data数据属性及ref获取dom

data项的定义 this.$refs获取dom 获取不到数据 这样中转下才ok 小结: data里不能用this.$ref. 另外使用visjs时候 view-source:http://visjs.org/examples/network/basicUsage.html 加载不出东西,点了按钮触发才ok 小结: create里应该是从上到下执行的. 转载于:https://www.cnb…