享元设计模式(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; } 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(); 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(); } }
}
|