首页 技术 正文
技术 2022年11月14日
0 收藏 936 点赞 4,606 浏览 2082 个字

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

一、概念

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

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

二、结构图

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

Java设计模式之亨元模式

三、实现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、这些类必须有一个工厂对象加以控制。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,493
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,295