享元模式(Flyweight)
利用共享技术有效的支持大量细粒度的对象。
在GoF23种设计模式中,属于结构型模式( Structural patterns)
。
以上为官方定义,那么用通俗易懂的话来说,怎么理解呢?
首先,我觉得这个中文翻译是真的棒!Flyweight直译为轻量级拳击手,而中文翻译为享元模式。
即共享元对象的模式,所谓元对象也就是细粒度的对象。形象来说,就是数据库连接池里面的单个连接。
- 优点
- 减少系统创建开销,提高系统性能
- 元数据复用,减少内存空间
- 缺点
- 会增加系统复杂度,需考虑线程安全
- 使用场景
- 系统设计时,存在大量相同的基础对象
- 为提升系统性能,需要设计一个元对象存储池
实现
角色说明
- flyweight
- 元对象接口
- concerteFlyweight
- 具体元对象
- flyweightFactory
- 元对象管理类
- 共享池
- client
- 调用者
举例
- Book.java
public interface Book {
void showName();
}
- ItBook.java
public class ItBook implements Book {
private String name;
@Override
public void showName() {
System.out.println("this book'name is " + name);
}
public ItBook(String name) {
this.name = name;
}
}
- Library.java
public class Library {
private static final Map<String, Book> BOOK_SELF = new ConcurrentHashMap<>();
public Book getBook(String name) {
Book book = BOOK_SELF.get(name);
if (null != book) {
System.out.println("已有该书,直接借出");
return book;
}
ItBook itBook = new ItBook(name);
BOOK_SELF.put(name, itBook);
System.out.println("wc竟然没有!赶紧进一批《" + name + "》");
return itBook;
}
}
- Client.java
public class Client {
public static void main(String[] args) {
Library library = new Library();
//第一次借
Book javaJvm1 = library.getBook("java虚拟机");
javaJvm1.showName();
//第二次借
Book javaJvm2 = library.getBook("java虚拟机");
javaJvm2.showName();
}
}
- output
wc竟然没有!赶紧进一批《java虚拟机》
this book'name is java虚拟机
已有该书,直接借出
this book'name is java虚拟机
实例
方法:java.lang.Integer#valueOf(java.lang.String, int)
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
该方法将 [-128,127]的元对象全部从缓存池中取,将其他区间的对象直接new。
总结
如果你需要大量的相同的基础对象来构建系统,享元模式请首先考虑。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名,转载请标明出处
最后编辑时间为: