设计模式之蝇量模式

蝇量模式
蝇量模式:通过共享的方式高效地支持大量的细粒度的对象。

优点:
减少运行时的对象的实例个数。
将许多“虚拟”对象的状态集中管理。

缺点:
系统设计更加复杂。
需要专门维护对象的外部状态。

适用场合:
需要大量细粒度对象。
这些对象的外部状态不多。
按照内部状态分成几个组,每一个组都仅用一个蝇量对象替代。

类结构图

示例代码:

package com.flyweight;

public abstract class Plant {
	public Plant() {
		
	}
	
	public abstract void display(int xCoord, int yCoord, int age);
}

 

package com.flyweight;

public class Tree extends Plant {

	@Override
	public void display(int xCoord, int yCoord, int age) {
		// TODO Auto-generated method stub
		//System.out.println("Tree x");
	}
}

 

package com.flyweight;

public class Grass extends Plant {

	@Override
	public void display(int xCoord, int yCoord, int age) {
		// TODO Auto-generated method stub
		//System.out.print("Grass x");
	}
}

 

package com.flyweight;

import java.util.HashMap;

public class PlantFactory {
	private HashMap<Integer,Plant> plantMap = new HashMap<Integer,Plant>();
	
	public PlantFactory() {
		
	}
	
	public Plant getPlant(int type) {
		if(!plantMap.containsKey(type)) {
			switch(type) {
			case 0:
				plantMap.put(0, new Tree());
				break;
			case 1:
				plantMap.put(1, new Grass());
				break;
			}
		}
		
		return plantMap.get(type);
	}
}

 

package com.flyweight;

public class PlantManager {
	private int length = 10000000;
	private int[] xArray = new int[length],yArray = new int[length],
			AgeArray = new int[length],typeArray = new int[length];
	
	private PlantFactory mPlantFactory;
	public PlantManager() {
		mPlantFactory = new PlantFactory();
		for(int i=0; i<length; i++) {
			xArray[i] = (int)(Math.random() * length);
			yArray[i] = (int)(Math.random() * length);
			AgeArray[i] = (int)(Math.random() * length)%5;
			typeArray[i] = (int)(Math.random() * length)%2;
		}
	}
	
	public void displayTree() {
		for(int i=0; i<length; i++) {
			mPlantFactory.getPlant(typeArray[i]).display(xArray[i], yArray[i], AgeArray[i]);
		}
	}
}

 

package com.flyweight;

public class MainTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		showMemInfo();
		
		PlantManager mPlantManager;
		mPlantManager = new PlantManager();
		
		showMemInfo();
		mPlantManager.displayTree();
		showMemInfo();
	}
	
	public static void showMemInfo() {
		//最大内存
		long max = Runtime.getRuntime().maxMemory();
		//分配内存
		long total = Runtime.getRuntime().totalMemory();
		//已分配内存中的剩余空间
		long free = Runtime.getRuntime().freeMemory();
		//已占用的内存
		long used = total - free;
		
		System.out.println("最大内存= " + max);
		System.out.println("已分配内存= " + total);
		System.out.println("已分配内存中的剩余空间= " + free);
		System.out.println("已用内存= " + used);
		System.out.println("时间= " + System.currentTimeMillis());
		System.out.println("");
		
	}

}

 输出结果

最大内存= 259522560
已分配内存= 16252928
已分配内存中的剩余空间= 15536784
已用内存= 716144
时间= 1441355500069

最大内存= 259522560
已分配内存= 194347008
已分配内存中的剩余空间= 32881632
已用内存= 161465376
时间= 1441355502603

最大内存= 259522560
已分配内存= 194347008
已分配内存中的剩余空间= 32881632
已用内存= 161465376
时间= 1441355503120

 

posted @ 2015-09-04 16:31  橙子123  阅读(322)  评论(0编辑  收藏  举报