享元设计模式(Flyweight Pattern)

描述: 享元设计模式主要用于减少对象的创建,以减少内存的占用提高性能这种类型的设计模式属于结构型模式,它减少了对象的数量从而改善应用所需的对象结构的方式

核心思想: 主要的思想和池化技术的概念类似。当我们取对象时如果有就返回,没有就创建。

使用场景:

  • 系统有大量的相似对象
  • 有缓冲池的场景

享元设计模式的优点:

  • 降低内存的消耗,提高使用率

享元设计模式的缺点:

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

示例:

  • 抽象享元对象
1
2
3
interface Book {
void borrow();
}
  • 享元对象的实现
1
2
3
4
5
6
7
8
9
10
11
12
13
class CreateBook implements Book {

private String name;

public CreateBook(String name) {
this.name = name;
}

@Override
public void borrow() {
System.out.println("借出一本书 书名是:" + name);
}
}
  • 享元工厂
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

class Llibrary {
private Map<String, Book> books;
private volatile static Llibrary llibrary = null;

private Llibrary() {
books = new HashMap<>();
}

//使用单例 图书馆必须是一个
public static Llibrary getLlibrary() {
if (llibrary == null) {
synchronized (Llibrary.class) {
if (llibrary == null) {
llibrary = new Llibrary();
}
}
}
return llibrary;
}
//此处借助于map 将享元对象存入map
//传进来一个书的名字 此时如果有就直接返回这本书 如果没有就 添加一本书进来
public Book libToBorrow(String bookName) {
Book book = null;
if (books.containsKey(bookName)) {
book = books.get(bookName);
} else {
book = new CreateBook(bookName);
books.put(bookName, book);
}
return book;
}

public int getBookSize() {
return books.size();
}
}
  • 调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class test {
static List<Book> books = new ArrayList<Book>();
static Llibrary llibrary = Llibrary.getLlibrary();
//调用book工厂 返回book对象
private static void studentBorrow(String bookName) {
books.add(llibrary.libToBorrow(bookName));
}

public static void main(String[] args) {
studentBorrow("java编程思想");
studentBorrow("java核心卷一");
studentBorrow("java核心卷二");

studentBorrow("java核心卷一");
for (Book book : books) {
book.borrow();
}
}


}