享元模式就是将大量细小对象进行缓存,达到减少对象的创建的开销,减少内存的消耗的目的。比如线程池,连接池以及JVM中的字符串常量池都是这个设计模式体现。
使用享元模式的对象需要有少数的不一样的状态,如果系统中同一类对象所有的属性值都是一样的,那跟单列模式类似,只要缓存一个对象就行了 全局使用。
如果同一类对象所有属性的值都是不一样的,使用享元模式的好处体现不出来,极端情况下缓存了所有同类的对象,那使用享元模式没有任何意义了。
享元模式中区分了内部状态与外部状态,内部状态就是不随着外部环境变化的状态,外部状态是随着外部环境变化的状态,在享元模式中需要隔离出内部状态与外部状态,然后通过外部状态进行缓存,达到减少创建与内存消耗的目的。
flyweight: 抽象享元类
concreteFlyweight:具体的享元类
flyweightFactory: 享元工厂
public class AbstractBook {
private String name;
private BigDecimal price;
private String id;
public AbstractBook(String id){
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
public class MyBook extends AbstractBook{
public MyBook(String id) {
super(id);
}
}
public class BookFactory {
private static Map<String,AbstractBook> bookMap = new HashMap<>();
public static AbstractBook getBook(String id){
AbstractBook abstractBook = bookMap.get(id);
if(abstractBook == null){
abstractBook = loadBook(id);
bookMap.put(id,abstractBook);
}
return abstractBook;
}
private static AbstractBook loadBook(String id){
AbstractBook abstractBook = new MyBook(id);
abstractBook.setName("西游记");
abstractBook.setPrice(new BigDecimal("21.1"));
return abstractBook;
}
}
public class Client {
public static void main(String[] args) {
AbstractBook book = BookFactory.getBook("12344");
System.out.println(book.getPrice());
}
}