之前在项目中接触过亨元模式这一种设计模式,当时因为项目赶进度,因此只不过是大概的了解了一下,刚好今天有时间,就写一篇博客详细的学习一下亨元模式。

一、概念

运用共享技术有效的支持大量细粒度的对象。(来自百度百科)

百度上的解释十分的抽象,相信很多人和我一样,咋看上去,一脸懵,不知道在说些什么,如果换一种说法,也许会更容易理解:亨元模式主要用于减少创建对象的数量,以减少内存占用和提高性能。

二、结构图

在看具体的实现案例之前,首先了解一下亨元模式的几个概念和UML结构图。

三、实现Demo

去图书馆借书的过程就是一个典型的亨元模式实现案例,当我们去图书馆借书时,如果书架上有这本书,那么就直接拿走,如果没有,就需要到图书管理处拿一本新书,对于整个图书馆来说,书其实是共享的。

在这个过程中,图书馆就相当于亨元工厂,书就相当于抽象的亨元接口,而每一个人借的书就相当于具体的亨元实现。在这其中,亨元工厂是核心。

首先,定义抽象的亨元接口,也就是书。

public interface Book (
// 借书的方法
public void borrowBook();
}

接下来,就是定义每一本书的具体实现类。

public class SpecificBook implements Book {
// 书名
private String bookName;
// 构造方法
public SpecificBook (Sting bookName){
this.bookName = bookName;
}
@Override
public void borrowBook(){
System.out.println("借出书的书名为:"+ this.bookName);
}
}

然后定义亨元工厂,也就是图书馆。

public class Library {
// 图书列表
private Map<String, Book> bookMap = new HashMap<String, Book>();
private static Library library = new Library();
// 采用单例模式创建图书馆
public static Library getInstance(){
return library;
}
// 向外借书
public Book studentLoan(String booName){
if (!bookMap.containsKey(bookName)){
bookMap.put(bookName, new Book(bookName));
}
return (Book)bookMap.get(bookName);
}
// 获得图书数量
public int getBookNumber(){
return bookMap.size();
}
}

最后,就是测试代码,也就是模拟学生去图书馆借书这一过程。

public class Student {
// 图书馆书的集合
private static List<Book> bookList = new ArrayList<Book>();
private static Library library;
public static void main(String[] args) {
library = Library.getInstance();
studentBorrowBook("java入门教程(一)");
studentBorrowBook("java入门教程(二)");
studentBorrowBook("java入门教程(一)");
studentBorrowBook("java入门教程(二)");
// 借书
for (Book book : bookList) {
book.borrowBook();
}
// 输出借书数目
System.out.println("学生借了"+bookList.size()+“本书,图书馆有”+library.getBookMember+"本书。");
private static void studentBorrowBook(string bookName) {
bookList.add(library.studentLoan(bookName));
}
}

在这个案例中,学生借了总共四本书,但是图书馆借出去只有两本。

四、总结分析

使用场景:

1、系统中有大量对象。

2、这些对象消耗大量内存。

3、这些对象的状态大部分可以外部化。

4、这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来事,每一组对象都可以用一个对象来代替。

5、系统不依赖于这些对象身份,这些对象是不可分辨的。

6、需要缓冲池的场景。

优点:

1、大大减少对象的创建,降低系统的内存,使效率提高。

缺点:

1、提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。

内部状态和外部状态:

内部状态:指对象共享出来的信息,存储在亨元对象内部并且不会随环境的改变而改变。

外部状态:指对象得以依赖的一个标记,是随环境改变而改变的,不可共享的状态。

注意事项:

1、注意划分外部状态和内部状态,否则可能会引起线程安全问题。

2、这些类必须有一个工厂对象加以控制。

Java设计模式之亨元模式的更多相关文章

  1. Java设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

  2. 11.java设计模式之享元模式

    基本需求: 小型的外包项目,给客户A做一个产品展示网站,客户A的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求都有些不同 每个客户要求发布的方式不一样,A要求以新闻的方式发布,B要求以博客的方 ...

  3. JAVA设计模式之享元模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述享元(Flyweight)模式的: Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是 ...

  4. 由奶茶店突发奇想开始了Java设计模式:享元模式

    目录 定义 意图 主要解决问题 何时使用 优缺点 结构 奶茶摊位的例子 奶茶店的例子 在什么情况下使用享元模式 定义 享元模式是对象的结构模式,享元模式以共享的方式高效的支持大量的细粒度对象,主要用于 ...

  5. c#设计模式系类:亨元模式

    一.引言 在软件开发过程中,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次去申请内存空间了,这样可能出现内存使用越来越多的情况,这样的问题是非常 ...

  6. 设计模式 -- 亨元模式(FlyWeight Pattern)

    用来尽可能减少内存使用量,适用于存在大量重复对象的场景,达到对象共享,避免创建过多对象的效果,提升性能,避免内存溢出. 定义: 使用共享对象有效支持大量细粒度对象. 适用场景: 系统中存在大量相似对象 ...

  7. Java设计模式之《桥接模式》及应用场景

    摘要: 原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6497919.html 这里摘抄一份他处的概念,你可以不必理会,先看下面得讲解与实例, ...

  8. Java设计模式之《外观模式》及应用场景

    原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6484128.html 1.外观模式简介 外观模式,一般用在子系统与访问之间,用于对访问屏蔽复 ...

  9. Java设计模式之《代理模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...

随机推荐

  1. html,body设置高度100%后底部有空白的bug

    html,body{ //... height:100% } #app{ //... } #footbar{ position:absolute;bottom:0px;left:0px;right:0 ...

  2. Django路由配置之正则表达式详解

    正则表达式详解 urls.py from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles ...

  3. Identity Card(hdu2629)

    输入方式:先输入一个整型,再输入不带空格未知长度/已知长度的字符串. 思考:用scanf_s()函数输入整型,再循环输入不带空格未知长度的字符串,用gets_s()函数. 注意:scanf_s()函数 ...

  4. 这次终于可以愉快的进行 appium 自动化测试了

    appium 是进行 app 自动化测试非常成熟的一套框架.但是因为 appium 设计到的安装内容比较多,很多同学入门都跪在了环境安装的部分.本篇讲述 appium 安卓环境的搭建,希望让更多童鞋轻 ...

  5. Docker 入门:镜像

    主要内容: 什么是镜像 下载镜像 pull 设置下载加速源 查看镜像 上传镜像 push 什么是镜像(image) 镜像是一个文件系统,提供了容器运行时需要用到的文件和参数配置.相当于平时在使用某个软 ...

  6. nodejs 开发服务端 部署到 iis 服务器环境 -- iisnode 安装问题解决记录

    开发环境 nodejs: v10.15.3 windows: 10 iis: 10 需求: 用Nodejs开发了服务端,要部署到IIS 需要在IIS服务器上安装iisnode,结果遇到问题:安装不上 ...

  7. HTTP 规范中的那些暗坑

    HTTP 协议可以说是开发者最熟悉的一个网络协议,「简单易懂」和「易于扩展」两个特点让它成为应用最广泛的应用层协议. 虽然有诸多的优点,但是在协议定义时因为诸多的博弈和限制,还是隐藏了不少暗坑,让人一 ...

  8. [256个管理学理论]005.羊群效应(Herd Behavior)

    羊群效应(Herd Behavior) 来自于大洋彼岸的让你看不懂的解释: “羊群效应”,也叫“从众效应”,是个人的观念或行为由于真实的或想像的群体的影响或压力,而向与多数人相一致的方向变化的现象.表 ...

  9. Jenkins在Pod中实现Docker in Docker并用kubectl进行部署

    Jenkins在Pod中实现Docker in Docker并用kubectl进行部署 准备工作 安装Jenkins Jenkins的kubernetes-plugin使用方法 说明 Jenkins的 ...

  10. 上位机C#通过OPCUA和西门子PLC通信

    写在前面: 很多人在学习OPCUA的时候,有个非常苦恼的问题,就是没有OPCUA服务器的环境,这时候,有些人可能会想到通过类似于KepServer这样的软件来实现.那么,有没有一种方式,实现快速搭建O ...