享元模式: 共享数据的模式。
例子:创建定制的Map-->FlyweightMap.
1. 默认填充DATA元数据,避免每次使用FlyweightMap时创建新的数据。
2. Map的数据结构
package designpattern.flyweight;
import java.util.AbstractMap;
import java.util.AbstractSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Countries {
//元数据
public static final String[] [] DATA = {{"CHINA", "BeiJing"},{"AMERICA", "Washington"},
{"Canada", "canada"}, {"Japan", "dongjing"},
{"Australia", "Sydney"}, {"Korea", "souer"}};
private static class FlyweightMap extends AbstractMap<String, String> {
private static Set<Map.Entry<String, String>> entries = new EntrySet(DATA.length);
@Override
public Set<Map.Entry<String, String>> entrySet() {
return entries;
}
//定制的Entry,访问元数据
private static class Entry implements Map.Entry<String, String> {
int index;
Entry(int index) {
this.index = index;
}
@Override
public int hashCode() {
return DATA[index][0].hashCode();
}
@Override
public boolean equals(Object obj) {
return DATA[index][0].equals(obj);
}
@Override
public String getKey() {
return DATA[index][0];
}
@Override
public String getValue() {
return DATA[index][1];
}
@Override
public String setValue(String arg0) {
throw new UnsupportedOperationException();
}
}
//定制的EntrySet,访问定制的Entry
static class EntrySet extends AbstractSet<Map.Entry<String, String>> {
private int size;
public EntrySet(int size) {
if(size < 0) {
size = 0;
} else if(size > DATA.length) {
size = DATA.length;
}
this.size = size;
}
@Override
public Iterator<Map.Entry<String, String>> iterator() {
return new Iter();
}
@Override
public int size() {
return size;
}
private class Iter implements Iterator<Map.Entry<String, String>> {
//该Entry访问元数据
private Entry entry = new Entry(-1);
@Override
public boolean hasNext() {
return entry.index < size-1;
}
@Override
public Map.Entry<String, String> next() {
entry.index ++;
return entry;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
}
}
static Map<String, String> select(final int size) {
return new FlyweightMap() {
@Override
public Set<java.util.Map.Entry<String, String>> entrySet() {
return new EntrySet(size);
}
};
}
static Map<String, String> map = new FlyweightMap();
public static Map<String, String> capitals() {
return map;
}
public static Map<String, String> capitals(int size) {
return select(size);
}
static List<String> names = new ArrayList<String>(map.keySet());
public static List<String> names() {
return names;
}
public static List<String> names(int size) {
return new ArrayList<String>(select(size).keySet());
}
public static void main(String[] args) {
System.out.println(capitals(10));
System.out.println(names(10));
System.out.println(new HashMap<String, String>(capitals(3)));
System.out.println(new LinkedHashMap<String, String>(capitals(3)));
}
}
//output
{CHINA=BeiJing, AMERICA=Washington, Canada=canada, Japan=dongjing, Australia=Sydney, Korea=souer}
[CHINA, AMERICA, Canada, Japan, Australia, Korea]
{Canada=canada, CHINA=BeiJing, AMERICA=Washington}
{CHINA=BeiJing, AMERICA=Washington, Canada=canada}