设计模式学习--享元模式
享元模式就是将大量细小对象进行缓存,达到减少对象的创建的开销,减少内存的消耗的目的。比如线程池,连接池以及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()); } }
下一篇:
Java观察者模式和发布订阅模式