设计模式之享元模式
享元模式可以解决的问题例子
提出问题:图书馆里有书籍,可以供给老师们阅读,图书馆里的每一个书名只对应着一本书(例如只有一本<金瓶梅>给老师们阅读,不会是多本),也就是说,我们的老师可以重名,但是书籍没有重名的.
用java 表示出第一个”小崔”借阅了图书馆中的<鹿鼎记>和<金瓶梅>
第二个”小崔”借阅了图书馆中的<火影忍者>和<金瓶梅>
分析
两个小崔老师,是两个不同的人,所以我们要生成两个对象,但是他们借阅的<金瓶梅>却是同一本书,金瓶梅应该是同一个对象.
解决
每一次创建书籍的对象的时候,我们通过BookFactory工厂来创建,这个工厂用来判断书籍对象是否已经生成,如果生成过,直接拿来用,没有生成过再创建.如图所示
代码例子
Book.java
public class Book {
String bookName; //书的名字,在一段时间里不同的老师可以翻阅同一本书,只要书名相同我们就认为同一本书
public Book(String bookName) {
super();
this.bookName = bookName;
}
public Book() {
super();
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
}
Teacher.java
import java.util.List;
public class Teacher {
String teacherName; //即使相同的姓名我们都会认为是同一个老师
List<Book> lBook; //老师借阅的书籍,一个老师可以看多本书,根据需求所以用List
public Teacher() {
super();
}
public Teacher(String teacherName) {
super();
this.teacherName = teacherName;
}
public Teacher(String teacherName, List<Book> lBook) {
super();
this.teacherName = teacherName;
this.lBook = lBook;
}
public String getTeacherName() {
return teacherName;
}
public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
}
public List<Book> getlBook() {
return lBook;
}
public void setlBook(List<Book> lBook) {
this.lBook = lBook;
}
}
BookFactory.java
import java.util.HashMap;
import java.util.Map;
public class BookFactory {
//书籍的容器
private Map<String, Book> pool;
//创建书籍的工厂,
public BookFactory() {
pool = new HashMap<String, Book>();
}
//判断这本书是否在容器中出现过
public Book getBook(String bookName) {
Book book = pool.get(bookName);
if (book == null) {
book = new Book();
book.setBookName(bookName);
pool.put(bookName, book);
}
return book;
}
}
测试类CuiTest.java
import java.util.ArrayList;
public class CuiTest {
public static void main(String[] args) {
BookFactory bookFactory = new BookFactory();
Teacher cui = new Teacher("小崔");
//小崔老师看的书
ArrayList<Book> cui1Lisst = new ArrayList<Book>();
Book cui1book1 = bookFactory.getBook("鹿鼎记");
Book cui1book2 = bookFactory.getBook("金瓶梅");
cui1Lisst.add(cui1book1);
cui1Lisst.add(cui1book2);
cui.setlBook(cui1Lisst);
//第二个老师也叫小崔
Teacher cui2 = new Teacher("小崔");
ArrayList<Book> cui2Lisst = new ArrayList<Book>();
Book cui2book1 = bookFactory.getBook("火影忍者");
Book cui2book2 = bookFactory.getBook("金瓶梅");
cui2Lisst.add(cui2book1);
cui2Lisst.add(cui2book2);
cui2.setlBook(cui2Lisst);
//两个老师虽然都叫小崔,不同的人生成的也是不同的对象
if(cui==cui2){
System.out.println("两个小崔来自一个对象");
}else{
System.out.println("两个小崔来自不同的对象");
}
if(cui1book2==cui2book2){
System.out.println("两本金瓶梅来自一个对象");
}else{
System.out.println("两本金瓶梅来自不同的对象");
}
}
}
测试结果