享元模式

/ 设计模式

享元模式(Flyweight)

利用共享技术有效的支持大量细粒度的对象

GoF23种设计模式中,属于结构型模式( Structural patterns)

以上为官方定义,那么用通俗易懂的话来说,怎么理解呢?

首先,我觉得这个中文翻译是真的棒!Flyweight直译为轻量级拳击手,而中文翻译为享元模式。

即共享元对象的模式,所谓元对象也就是细粒度的对象。形象来说,就是数据库连接池里面的单个连接。

实现

模式总览

角色说明

举例

book-uml

public interface Book {

    void showName();
}
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;
    }
}
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;
    }

}
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();
    }
}
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。

总结

如果你需要大量的相同的基础对象来构建系统,享元模式请首先考虑。