23种设计模式之享元模式
模式结构
- 抽象享元角色(Flyweight):是所有的具体享元类的基类,为具体享元规范需要实现的公共接口,非享元的外部状态以参数的形式通过方法传入。
- 具体享元(Concrete Flyweight)角色:实现抽象享元角色中所规定的接口。
- 享元工厂(Flyweight Factory)角色:负责创建和管理享元角色。当客户对象请求一个享元对象时,享元工厂检査系统中是否存在符合要求的享元对象,如果存在则提供给客户;如果不存在的话,则创建一个新的享元对象。
案例
public interface Book {
public void borrow();
}
public class ConcreteBook implements Book{
private String name;
public ConcreteBook(String name){
this.name=name;
}
@Override
public void borrow() {
System.out.println("借出一本书:" + name);
}
}
public class Library {
private Map<String, Book> bookPools = new HashMap<>();
private static Library factory = new Library();
public static Library getInstance(){
return factory;
}
public Book libToBorrow(String name){
Book book = null;
if(bookPools.containsKey(name)){
book = bookPools.get(name);
}else{
book = new ConcreteBook(name);
bookPools.put(name,book);
}
return book;
}
public int getAllBookSize(){
return bookPools.size();
}
}
public class FlyweightTest {
private static List<Book> books = new ArrayList<>();
private static Library library;
public static void main(String[] args) {
library = Library.getInstance();
studentBorrow("万历15年");
studentBorrow("万历15年");
studentBorrow("明朝那些事儿");
studentBorrow("月亮与六便士");
for(Book book: books){
book.borrow();
}
}
private static void studentBorrow(String name){
books.add(library.libToBorrow(name));
}
}