享元模式(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