工厂设计模式
作用:就是用于生产对象的。
一、在Java项目中
package com.cn.factory;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
/**
* Author:Liu Zhiyong(QQ:1012421396)
* Version:Version_1
* Date:2016年8月27日15:42:07
* Desc:
工厂设计模式:就是用于生产对象的。
*/
public class Demo1 {
public static void main(String[] args) throws Exception {
Person p = (Person)getInstance();
System.out.println(p);
}
//需求:编写一个工厂方法根据配置文件返回对应的对象。
public static Object getInstance() throws Exception{
//读取配置文件
BufferedReader bufferedReader = new BufferedReader(new FileReader(new File("./src/com/cn/factory/info.txt")));
//读取第一行:读取类文件的信息
String className = bufferedReader.readLine();
//通过完整类名获取对应的Class对象
Class clazz = Class.forName(className);
//获取对应的构造方法
Constructor constructor = clazz.getDeclaredConstructor(null);
constructor.setAccessible(true);//设置访问权限可以访问
//创建对象
Object obj = constructor.newInstance(null);
//给对象设置对应的属性值
String line = null;
while((line = bufferedReader.readLine()) != null){
String[] datas = line.split("=");
Field field = clazz.getDeclaredField(datas[0]);
field.setAccessible(true);//设置可以访问
if(field.getType() == int.class){
field.set(obj, Integer.parseInt(datas[1]));
}else{
field.set(obj, datas[1]);
}
}
return obj;
}
}
package com.cn.reflect;
public class Person {
private int id;
String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
private Person() {
}
public void eat(){
System.out.println(name + "高高兴兴吃饭。。。");
}
public void eat(int num){
System.out.println(name + "高高兴兴吃了" + num + "大碗饭。。。");
}
private void sleep(){
System.out.println(name + "偷偷睡觉。。。");
}
private static void work(){
System.out.println("努力工作。。。");
}
public void sum(int[] arr){
System.out.println("长度是" + arr.length);
}
@Override
public String toString() {
return "编号" + this.id + "\t姓名:" + this.name;
}
}
info.txt文本文件
com.cn.factory.Person
id=110
name=木丁西
二、在web项目中
步骤:
①在src下添加配置资源包,例如 instance.properties
注意:配置文件中类名字符串前面可以有空格,后面不能有,否则会异常找不到类。
②写工厂类
package com.cn.factory;
import java.util.ResourceBundle;
/**
* 工厂,创建dao或service实例
* @author liuzhiyong
*
*/
public class BeanFactory {
//加载配置文件
private static ResourceBundle bundle;
static{
bundle = ResourceBundle.getBundle("instance");//加载服务器下/hotel/WEB-INF/classes/instance.properties
}
/**
* 根据指定的key,读取配置文件,获取类的全路径,创建对象
* @param <T>
* @param key 配置文件中的key,例如:dao=com.cn.Dao
* @return
*/
public static <T> T getInstance(String key, Class<T> clazz){
String className = bundle.getString(key);
try {
return (T) Class.forName(className).newInstance();//反射,创建对象
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
③web项目中不固定写死的地方,需要创建对象时使用