快捷搜索: 王者荣耀 脱发

设计模式学习--享元模式

享元模式就是将大量细小对象进行缓存,达到减少对象的创建的开销,减少内存的消耗的目的。比如线程池,连接池以及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());

    }
}
经验分享 程序员 微信小程序 职场和发展