您的位置:首页 > 其它

工厂设计模式

2017-03-16 09:57 190 查看


工厂设计模式

作用:就是用于生产对象的。

一、在Java项目中

需求:根据txt配置文件,生产对象。

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项目中不固定写死的地方,需要创建对象时使用



 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: