基本介绍:
采用一个共享来避免大量拥有相同内容对象的开销。这种开销中最常见、直观的就是内存的损耗。享元模式以共享的方式高效的支持大量的细粒度对象。
示例代码:
package org.brando;
import org.brando.FlyweightFactory.WordTypeEnum;
/**
*
* 类说明: 测试类
* @author Brando 2018年3月29日 下午2:03:59
*/
public class Launcher {
public static void main(String[] args) {
BaseWord a = FlyweightFactory.createWord(WordTypeEnum.A);
BaseWord b = FlyweightFactory.createWord(WordTypeEnum.B);
a.showText();
b.showText();
}
}
package org.brando;
/**
*
* 类说明: 基础字符类
* @author Brando 2018年5月4日 下午3:21:24
*/
public class BaseWord {
public String text;
public void showText() {
System.out.println(this.text);
}
}
package org.brando;
/**
*
* 类说明: 字母A
* @author Brando 2018年5月4日 下午4:21:46
*/
public class A extends BaseWord {
public A() {
this.text = "A";
}
}
package org.brando;
/**
*
* 类说明: 字母B
* @author Brando 2018年5月4日 下午4:21:54
*/
public class B extends BaseWord {
public B() {
this.text = "B";
}
}
package org.brando;
import java.util.HashMap;
import java.util.Map;
/**
*
* 类说明: 享元工厂.
* @author Brando 2018年5月4日 下午3:18:26
*/
public class FlyweightFactory {
/**缓存**/
private static Map<String, BaseWord> baseWordMap = new HashMap<String, BaseWord>();
/**
*
* 方法说明: 创建字母.
* @author Brando 2018年5月4日 下午3:28:58
* @return
*/
public static BaseWord createWord(WordTypeEnum wordType) {
BaseWord word = baseWordMap.get(wordType.getName());
if(word == null) {
switch (wordType) {
case A:
word = new A();
baseWordMap.put(wordType.getName(), word);
break;
case B:
word = new B();
baseWordMap.put(wordType.getName(), word);
break;
default:
break;
}
}
return word;
}
/**
*
* 枚举说明: 字符类型枚举.
* @author Brando 2018年5月4日 下午4:17:12
*/
public enum WordTypeEnum {
A("A"), B("B");
private String name;
WordTypeEnum(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
}