享元模式

享元模式(Flyweight Pattern)是结构型模式中的一种,主要用于减少创建对象的数量,以减少内存占用和提高性能。它减少对象数量,从而改善应用所需的对象结构的方式。其中最经典的应用就是JDK中String的实现,相同变量值的String都会放入同一个地址,然后这些变量指向这些地址,当有变量值变化时,变量的引用会重新查找指向地址,如果没有相同变量值得地址,则复制到新的地址。同样的,享元模式就是是使用这一种模式,减少创建相同对象数量从而使内存开销更小。

使用场景: 1、系统有大量相似对象。 2、需要缓冲池的场景。


/*
 * Copyright,ShanNong Inc,2018 and onwards
 *
 * Author:fanghua fan
 */

package com.fanghua.designpattrn.flyweightpattern;

import java.util.HashMap;
import java.util.Map;

/**
 * 数学抽象类
 */
public interface Math {
    String study();

    String happy(String name);
}

/**
 * 创建数学下几何学对象
 */
class Geometry implements Math {
    String chapters;

    public Geometry(String chapters) {
        this.chapters = chapters;
    }

    public String study() {
        System.out.println("Good content!" + chapters);
        return "Good content!" + chapters;
    }

    public String happy(String name) {
        return name + " happy to learn " + chapters;
    }
}

/**
 * 创建一个几何学学习工厂
 */
class MathStudyFactory {
    private static final Map<String, Math> shareObject = new HashMap<String, Math>();

    /**
     * 获取学习内容
     *
     * @param chapters
     * @return
     */
    public static Math getMathContent(String chapters) {
        Math findRes = shareObject.get(chapters);
        // 判断共享池中是否存在此章节
        if (findRes == null) {
            findRes = new Geometry(chapters);
            shareObject.put(chapters, findRes);
        }
        return findRes;
    }
}

/**
 * 数学家们学习数学
 */
class MathematicianStory {
    static String[] chapters = {"平面几何", "立体几何", "解析几何"};

    public static void main(String[] args) {
        // 100万个数学家学习
        for (int i = 0; i < 100; i++) {
            Math resObject = MathStudyFactory.getMathContent(getRandomChapter());
            resObject.study();
            String happyDone = resObject.happy(java.lang.Math.random() + "");
            System.out.println("Done: " + happyDone);
        }
    }

    private static String getRandomChapter() {
        return chapters[(int) (java.lang.Math.random() * chapters.length)];
    }
}

(全文完)3/30/2018 11:43:29 PM