全局实例框架的设计

1、全局实例

全局实例:Global Instance

一直存在的、不会被GC回收销毁的对象

一般使用public static来创建一个全局实例

演示一下:

1、创建全局实例

public static Car car = new Car();

2、访问全局实例

AfGlobals.car.run();

在任何时候都可以访问,在任何地点都可以访问

代码演示(方便理解记忆)(1.0)

3个普通类:

public class Car
{
	public void run()
	{
		System.out.println("汽车....");
	}
}
public class Plane
{
	public void fly()
	{
		System.out.println("飞机飞....");
	}
}
public class Train
{
	public void speed()
	{
		System.out.println("火车....");
	}
}

全局对象类:

public class AfGlobal
{
	public static Car car = new Car();
	
	public static Plane plane = new Plane();
	
	public static Train train = new Train();
}

测试类:

public class Test
{

	public static void main(String[] args)
	{
		AfGlobal.car.run();
		
		AfGlobal.plane.fly();
		
		AfGlobal.train.speed();
	}

}

2、全局实例管理

AfGlobals,负责全局实例的管理

项目里所需要的全局实例,都交给它创建和管理

继续看代码(升级) (1.1)

将所有的实例放到一个Map中,当需要实例的时候,初始化执行一次,然后通过get直接获取value

- 在AfGlobals创建所有全局实例,放在map中

- 每个全局实例关联一个唯一的名字

- 在使用的时候,按名字取出 

实例管理类:

public class AfGlobal
{
	public static Map<String, Object>map = new HashMap<>(); //用来存储实例
	
	/**
	 * 初始化操作
	 */
	public static void init()
	{
		Car car = new Car();
		map.put("car", car);
		
		Plane plane = new Plane();
		map.put("plane", plane);
		
		Train train = new Train();
		map.put("train", train);
	}
	
	/**
	 * 
	 * @param key 
	 * @return 返回对应于key的对象
	 */
	public static Object get(String key)
	{
		return map.get(key);
	}
}

测试类: 

public class Test
{

	public static void main(String[] args)
	{
		//初始化所有全局实例的容器
		AfGlobal.init();
		
		//访问全局对象
		Car car = (Car)AfGlobal.get("car");
		car.run();
		
		System.out.println("exit");
	}

}

 细节:AfGlobals.map是全局实例,一直存在、不会销毁,所以此map里存储的对象都成了全局实例

3、全局实例框架 

框架,就是对相似的流程进行统一化处理 

每个全局实例的创建、初始化和访问流程,都是类似的

代码再升级(2.0)

1、添加af-global.xml配置文件

 

2、由AfGlobal框架自动完成全局实例的创建  loadConfig()

3、当需要访问时,从AfGlobals取得全局实例的引用 obj = afGlobal.get(name)

将类名字存放到xml文件中,利用对xml的操作来进行处理

全局框架类:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import my.Car;
import my.Plane;
import my.Train;

public class AfGlobal
{
	public static Map<String, Object>map = new HashMap<>(); //用来存储实例
	
	//静态代码快,首次访问该类时,将运行代码块,且只执行一次
	static
	{
		try {
			loadConfig();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 初始化操作
	 * @throws Exception 
	 */
	public static void loadConfig() throws Exception
	{
		InputStream inputStream = AfGlobal.class.getResourceAsStream("/af-global.xml");
		
		if(inputStream == null)
			throw new Exception("找不到指定文件");
		
		//加载xml
		SAXReader reader = new SAXReader();
		Document doc = reader.read(inputStream);
		
		Element root = doc.getRootElement();
		List<Element> serviceList = root.elements("global");
		
		for(Element e : serviceList)
		{
			String name = e.attributeValue("name").trim();
			String clazz = e.attributeValue("class").trim();
			
			//创建实例,存入map
			try 
			{
				Class cls = Class.forName(clazz);
				Object obj = cls.newInstance();
				map.put(name, obj);
			}catch(Exception ex)
			{
				System.out.println("无法加载 : " + clazz + " : " + ex.getMessage());
			}
		}
	}
	
	/**
	 * 
	 * @param key 
	 * @return 返回对应于key的对象
	 */
	public static Object get(String key)
	{
		return map.get(key);
	}
}

 配置文件(放在src目录下):

<?xml version="1.0" encoding="UTF-8"?>
<config>

	<global name="car" class="my.Car"></global>
	
	<global name="train" class="my.Train"></global>
	
	<global name="plane" class="my.Plane"></global>
	
</config>

 测试类:

import af.global.AfGlobal;

public class Test
{

	public static void main(String[] args)
	{
		
		//访问全局对象
		Car car = (Car)AfGlobal.get("car");
		car.run();
		
		System.out.println("exit");
	}

}

4、框架的打包 

框架,执行的是统一化的处理流程,所以框架一般是通用的

因此,可以将AfGlobal打包成jar文件 

 

5、框架的优化 (1)

考虑:全局实例在创建之后,可能需要进一步的优化

比如:

使用汽车之前,先给汽车加点油

 

所以:在框架里应该允许添加一个实例的初始化方法

 1、修改af-global.xml

<global name="car" class="my.Car" init="getReady"></global>

2、修改AfGlobal.loadConfig()

在创建实例之后,紧接着调用它的初始化方法

public class Car
{
	public void run()
	{
		System.out.println("汽车....");
	}
	
	public void getReady()
	{
		System.out.println("加油~~~~~");
	}
}
<?xml version="1.0" encoding="UTF-8"?>
<config>

	<global name="car" class="my.Car" init="getReady"></global>
	
	<global name="train" class="my.Train"></global>
	
	<global name="plane" class="my.Plane"></global>
	
</config>
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import my.Car;
import my.Plane;
import my.Train;

public class AfGlobal
{
	public static Map<String, Object>map = new HashMap<>(); //用来存储实例
	
	//静态代码快,首次访问该类时,将运行代码块,且只执行一次
	static
	{
		try {
			loadConfig();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 初始化操作
	 * @throws Exception 
	 */
	public static void loadConfig() throws Exception
	{
		InputStream inputStream = AfGlobal.class.getResourceAsStream("/af-global.xml");
		
		if(inputStream == null)
			throw new Exception("找不到指定文件");
		
		//加载xml
		SAXReader reader = new SAXReader();
		Document doc = reader.read(inputStream);
		
		Element root = doc.getRootElement();
		List<Element> serviceList = root.elements("global");
		
		for(Element e : serviceList)
		{
			String name = e.attributeValue("name").trim();
			String clazz = e.attributeValue("class").trim();
			String init = e.attributeValue("init");
			
			//创建实例,存入map
			try 
			{
				Class cls = Class.forName(clazz);
				Object obj = cls.newInstance();
				
				if(init != null)
				{
					Method method = cls.getDeclaredMethod(init);
					method.invoke(obj);
				}
				
				map.put(name, obj);
			}catch(Exception ex)
			{
				System.out.println("无法加载 : " + clazz + " : " + ex.getMessage());
			}
		}
	}
	
	/**
	 * 
	 * @param key 
	 * @return 返回对应于key的对象
	 */
	public static Object get(String key)
	{
		return map.get(key);
	}
}

5、框架的优化 (2)

泛型的返回值 ,解决下图问题

	public static <T>T get(String key)
	{
		return (T)map.get(key);
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值