享元模式是对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对象。
享元对象能做到共享的关键是区分内蕴状态和外蕴状态。
一个内蕴状态是存储在享元对象内部的,并且是不会随环境改变而有所不同的。因此,一个享元可以具有内蕴状态并可以共享。
一个外蕴状态时随环境改变而改变的、不可以共享的状态。享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。
外蕴状态不可以影响享元对象的内蕴状态。换句话说,它们是相互独立的。
一、享元模式的种类
2、java代码
FlyWeight抽象类:
package flyweight.simple;
abstract public class FlyWeight {
abstract public void operation(String state);
}
abstract public void operation(String state);
}
ConcreteFlyWeight类:
package flyweight.simple;
public class ConcreteFlyWeight extends FlyWeight {
private Character intrinsicState = null;
public ConcreteFlyWeight(Character state){
this.intrinsicState = state;
}
public void operation(String state) {
System.out.println("IntrinsicState is " + intrinsicState
+ " and ExtrinsicState is " + state + "。。。。。。");
}
}
private Character intrinsicState = null;
public ConcreteFlyWeight(Character state){
this.intrinsicState = state;
}
public void operation(String state) {
System.out.println("IntrinsicState is " + intrinsicState
+ " and ExtrinsicState is " + state + "。。。。。。");
}
}
FlyWeightFactory类:
package flyweight.simple;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class FlyWeightFactory {
private HashMap flies = new HashMap();
public FlyWeightFactory(){
System.out.println("Factory is created。。。。。。");
}
public FlyWeight factory(Character state){
if(flies.containsKey(state)){
return (FlyWeight)flies.get(state);
}else {
FlyWeight fly = new ConcreteFlyWeight(state);
flies.put(state, fly);
return fly;
}
}
public void checkFlyWeight(){
int i = 0;
System.out.println("------------checkFlyWeight---------------");
for(Iterator iter = flies.entrySet().iterator();iter.hasNext();){
Map.Entry e = (Map.Entry)iter.next();
System.out.println("Item" + (++i) + ":" + e.getKey());
}
System.out.println("------------checkFlyWeight---------------");
}
}
import java.util.Iterator;
import java.util.Map;
public class FlyWeightFactory {
private HashMap flies = new HashMap();
public FlyWeightFactory(){
System.out.println("Factory is created。。。。。。");
}
public FlyWeight factory(Character state){
if(flies.containsKey(state)){
return (FlyWeight)flies.get(state);
}else {
FlyWeight fly = new ConcreteFlyWeight(state);
flies.put(state, fly);
return fly;
}
}
public void checkFlyWeight(){
int i = 0;
System.out.println("------------checkFlyWeight---------------");
for(Iterator iter = flies.entrySet().iterator();iter.hasNext();){
Map.Entry e = (Map.Entry)iter.next();
System.out.println("Item" + (++i) + ":" + e.getKey());
}
System.out.println("------------checkFlyWeight---------------");
}
}
Client类:
package flyweight.simple;
public class Client {
public static void main(String args[]){
FlyWeightFactory factory = new FlyWeightFactory();
FlyWeight fly = factory.factory(new Character('a'));
fly.operation("First Call");
fly = factory.factory(new Character('b'));
fly.operation("Second Call");
fly = factory.factory(new Character('a'));
fly.operation("Third Call");
factory.checkFlyWeight();
}
}
public static void main(String args[]){
FlyWeightFactory factory = new FlyWeightFactory();
FlyWeight fly = factory.factory(new Character('a'));
fly.operation("First Call");
fly = factory.factory(new Character('b'));
fly.operation("Second Call");
fly = factory.factory(new Character('a'));
fly.operation("Third Call");
factory.checkFlyWeight();
}
}
abstract public class FlyWeight {
abstract public void operation(String state);
}
public class Client {
public static void main(String args[]){
FlyWeightFactory factory = new FlyWeightFactory();
FlyWeight fly = factory.factory("abc");
fly.operation("Composite Call");
factory.checkFlyWeight();
}
}
abstract public void operation(String state);
}
ConcreteFlyWeight类:
package flyweight.composite;
public class ConcreteFlyWeight extends FlyWeight{
private Character intrinsicState = null;
public ConcreteFlyWeight(Character state){
this.intrinsicState = state;
}
public void operation(String state) {
System.out.println("IntrinsicState is " + intrinsicState
+ " and ExtrinsicState is " + state + "。。。。。。");
}
}
private Character intrinsicState = null;
public ConcreteFlyWeight(Character state){
this.intrinsicState = state;
}
public void operation(String state) {
System.out.println("IntrinsicState is " + intrinsicState
+ " and ExtrinsicState is " + state + "。。。。。。");
}
}
ConcreteCompositeFlyWeight类:
package flyweight.composite;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class ConcreteCompositeFlyWeight extends FlyWeight{
private HashMap flies = new HashMap(10);
public ConcreteCompositeFlyWeight(){
System.out.println("ConcreteCompositeFlyWeight is created......");
}
public void add(Character key ,FlyWeight fly){
flies.put(key, fly);
}
public void operation(String state) {
FlyWeight fly = null;
for(Iterator iter = flies.entrySet().iterator();iter.hasNext();){
Map.Entry e = (Map.Entry)iter.next();
fly = (FlyWeight)e.getValue();
fly.operation(state);
}
}
}
import java.util.Iterator;
import java.util.Map;
public class ConcreteCompositeFlyWeight extends FlyWeight{
private HashMap flies = new HashMap(10);
public ConcreteCompositeFlyWeight(){
System.out.println("ConcreteCompositeFlyWeight is created......");
}
public void add(Character key ,FlyWeight fly){
flies.put(key, fly);
}
public void operation(String state) {
FlyWeight fly = null;
for(Iterator iter = flies.entrySet().iterator();iter.hasNext();){
Map.Entry e = (Map.Entry)iter.next();
fly = (FlyWeight)e.getValue();
fly.operation(state);
}
}
}
FlyWeightFactory类:
package flyweight.composite;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class FlyWeightFactory {
private HashMap flies = new HashMap();
public FlyWeightFactory(){
System.out.println("FlyWeightFactory is created......");
}
public FlyWeight factory(String compositeState){
ConcreteCompositeFlyWeight compositeFly = new ConcreteCompositeFlyWeight();
int length = compositeState.length();
Character state = null;
for(int i=0 ; i<length ; i++){
state = new Character(compositeState.charAt(i));
System.out.println("factory(" + state + ")");
compositeFly.add(state, this.factory(state));
}
return compositeFly;
}
public FlyWeight factory(Character state) {
if(flies.containsKey(state)){
return (FlyWeight)flies.get(state);
}else{
FlyWeight fly = new ConcreteFlyWeight(state);
flies.put(state, fly);
return fly;
}
}
public void checkFlyWeight(){
int i = 0;
System.out.println("------------checkFlyWeight---------------");
for(Iterator iter = flies.entrySet().iterator();iter.hasNext();){
Map.Entry e = (Map.Entry)iter.next();
System.out.println("Item" + (++i) + ":" + e.getKey());
}
System.out.println("------------checkFlyWeight---------------");
}
}
import java.util.Iterator;
import java.util.Map;
public class FlyWeightFactory {
private HashMap flies = new HashMap();
public FlyWeightFactory(){
System.out.println("FlyWeightFactory is created......");
}
public FlyWeight factory(String compositeState){
ConcreteCompositeFlyWeight compositeFly = new ConcreteCompositeFlyWeight();
int length = compositeState.length();
Character state = null;
for(int i=0 ; i<length ; i++){
state = new Character(compositeState.charAt(i));
System.out.println("factory(" + state + ")");
compositeFly.add(state, this.factory(state));
}
return compositeFly;
}
public FlyWeight factory(Character state) {
if(flies.containsKey(state)){
return (FlyWeight)flies.get(state);
}else{
FlyWeight fly = new ConcreteFlyWeight(state);
flies.put(state, fly);
return fly;
}
}
public void checkFlyWeight(){
int i = 0;
System.out.println("------------checkFlyWeight---------------");
for(Iterator iter = flies.entrySet().iterator();iter.hasNext();){
Map.Entry e = (Map.Entry)iter.next();
System.out.println("Item" + (++i) + ":" + e.getKey());
}
System.out.println("------------checkFlyWeight---------------");
}
}
Client类:
package flyweight.composite;
public class Client {
public static void main(String args[]){
FlyWeightFactory factory = new FlyWeightFactory();
FlyWeight fly = factory.factory("abc");
fly.operation("Composite Call");
factory.checkFlyWeight();
}
}