享元模式: 共享数据的模式。
例子:创建定制的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
{
private static Set
> entries = new EntrySet(DATA.length); @Override public Set
> entrySet() { return entries; } //定制的Entry,访问元数据 private static class Entry implements Map.Entry
{ 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
> { 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
> iterator() { return new Iter(); } @Override public int size() { return size; } private class Iter implements Iterator
> { //该Entry访问元数据 private Entry entry = new Entry(-1); @Override public boolean hasNext() { return entry.index < size-1; } @Override public Map.Entry
next() { entry.index ++; return entry; } @Override public void remove() { throw new UnsupportedOperationException(); } } } } static Map
select(final int size) { return new FlyweightMap() { @Override public Set
> entrySet() { return new EntrySet(size); } }; } static Map
map = new FlyweightMap(); public static Map
capitals() { return map; } public static Map
capitals(int size) { return select(size); } static List
names = new ArrayList
(map.keySet()); public static List
names() { return names; } public static List
names(int size) { return new ArrayList
(select(size).keySet()); } public static void main(String[] args) { System.out.println(capitals(10)); System.out.println(names(10)); System.out.println(new HashMap
(capitals(3))); System.out.println(new LinkedHashMap
(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}