zoukankan      html  css  js  c++  java
  • 设计模式之蝇量模式

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

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

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

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

    类结构图

    示例代码:

    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
    
  • 相关阅读:
    顺序前缀改为随机性前缀 反转时间戳 反转年月日
    后台组件的治理思路
    干货 | 高耦合场景下,Trip.com如何做支付设计与落地
    每天响应数亿次请求,腾讯云如何提供高可用API服务?
    系统管理及操作命令
    远程连接及系统管理
    linux系统部署安装过程
    day 1 硬件组成概念及介绍笔记
    day 4
    day 3
  • 原文地址:https://www.cnblogs.com/chengzi123/p/4781911.html
Copyright © 2011-2022 走看看