设计模式之_工厂系列_03

package com.learn.spring;

/**
 * 这个Factory模拟Spring,我把它改成interface
 * Spring的意思是这样的,当你拿到任何的具体的子类的时候,
 * 
 * @author Leon.Sun
 *
 */
public interface BeanFactory {

	/**
	 * 它里面有一个方法叫做getBean
	 * 每个bean有自己的一个名字
	 */
	Object getBean(String id);
}
package com.learn.spring;

/**
 * 作为Car来说,他实现了Moveable接口,
 * Moveable里面有一个run,
 * @author Leon.Sun
 *
 */
public class Car implements Moveable {
	
	public void run() {
		System.out.println("冒着烟奔跑中car......");
	}

}
package com.learn.spring;

public interface Moveable {
	
	void run();

}
package com.learn.spring;

import java.util.Properties;

public class Test {
	
	public static void main(String[] args) throws Exception {
		
		/**
		 * 在java.util里面有一个Propertie
		 * 总而言之这个Properties是读配置文件的
		 */
		Properties props = new Properties();
		
		/**
		 * 我们需要的是一个InputStream,这个InputStream怎么读,
		 * 由于我现在把Spring.properties是放在source里面,
		 * 所以他编译之后会放在bin里面,也就是会放在项目的classpath里面,
		 * 总而言之你要知道他可以把配置文件读出来,先学脉络,load什么?
		 * 站在Java虚拟机的角度,每一个class的类load到内存之后,
		 * 都会当成一个Class对象,getClassLoader就拿到装载这个对象那个类装载器
		 * 然后他有一个方法getResourceAsStream,这句话是说你把这个文件当做InputStream
		 * 也就是当做可以读进来的流来给他拿过来,注意他的类路径在根上,你要写清楚了
		 * 把这个文件当做InputStream,把它转换成一个Properties对象,
		 * 转换成对象之后,他这个文件里面缩写的配置文件的信息,VehicleType这个就会被称之为key,
		 * com.learn.spring.Car这个就被称之为value
		 * 
		 * 如果我想改成别的产品简单,比如我改成Train,我只要改这么一个地方
		 * 就变成小火车..... 你发现我只要直接改配置文件,我从配置文件拿到的具体的类型就已经发生了改变
		 * 
		 */
		props.load(Test.class.getClassLoader().getResourceAsStream("com/learn/spring/spring.properties"));
		
		/**
		 * 他的类的名字
		 * 左边的那个是key,
		 * 如果你看的还是不太清就打印一下
		 */
		String vehicleTypeName = props.getProperty("VehicleType");
		
		/**
		 * com.learn.spring.Car
		 * 你可以发现这样可以读取配置文件的信息
		 * 读到这个信息之后,注意我拿到的是一个字符串,
		 * 我想把这个字符串所代表的这个类给他产生一个新对象出来,
		 * 我们要用到JAVA的反射机制
		 */
		System.out.println(vehicleTypeName);
		
		/**
		 * Class.forName的意思是把这个字符串所代表的这个类给他load到内存,
		 * 大家知道JAVA的程序要想运行,首先会把Class文件load到内存,装载到内存,
		 * 装载到内存只是把Class文件装载到内存,但是他并没有产生这个类的对象,
		 * 产生这个类的对象用newInstance,会调用他参数为空的构造方法,
		 * 所以你只要保证这个参数为空的构造方法就行了,这时候它会产生一个新对象
		 * 产生的新对象是Object类型,你要想用的话把他强制转化为Moveable类型
		 */
		Object o = Class.forName(vehicleTypeName).newInstance();
		
		/**
		 * 把他强制转换为Moveable类型
		 */
		Moveable m = (Moveable)o;
		
		m.run();				
		
		/**
		 * Spring的意思是说,你不要再new这个Car了
		 * 具体new什么你写在配置文件里面吧
		 * 你要想new Car就new Car,想new别的就new别的
		 * Car和Train实现了Moveable接口,
		 * 就不要在这里new了,我们能不能写在配置文件里面,
		 * 答案是可以的,我先写一种配置文件,JAVA里面有一种最常见的配置文件
		 * 在Test里面我new什么是根据配置文件来定的,这就不行了吗,
		 * 这个东西具体怎么写,
		 */
		// Moveable m = new Car();
		// m.run();
		
	}

}
package com.learn.spring;

public class Train implements Moveable {

	@Override
	public void run() {
		System.out.println("小火车....");
	}

}
VehicleType=com.learn.spring.Train

猜你喜欢

转载自blog.csdn.net/Leon_Jinhai_Sun/article/details/89512318