工厂设计模式

工厂设计模式

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

一、在Java项目中

需求:根据txt配置文件,生产对象。
  1. package com.cn.factory;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileReader;
  5. import java.lang.reflect.Constructor;
  6. import java.lang.reflect.Field;
  7. /**
  8. * Author:Liu Zhiyong(QQ:1012421396)
  9. * Version:Version_1
  10. * Date:2016年8月27日15:42:07
  11. * Desc:
  12. 工厂设计模式:就是用于生产对象的。
  13. */
  14. public class Demo1 {
  15. public static void main(String[] args) throws Exception {
  16. Person p = (Person)getInstance();
  17. System.out.println(p);
  18. }
  19. //需求:编写一个工厂方法根据配置文件返回对应的对象。
  20. public static Object getInstance() throws Exception{
  21. //读取配置文件
  22. BufferedReader bufferedReader = new BufferedReader(new FileReader(new File("./src/com/cn/factory/info.txt")));
  23. //读取第一行:读取类文件的信息
  24. String className = bufferedReader.readLine();
  25. //通过完整类名获取对应的Class对象
  26. Class clazz = Class.forName(className);
  27. //获取对应的构造方法
  28. Constructor constructor = clazz.getDeclaredConstructor(null);
  29. constructor.setAccessible(true);//设置访问权限可以访问
  30. //创建对象
  31. Object obj = constructor.newInstance(null);
  32. //给对象设置对应的属性值
  33. String line = null;
  34. while((line = bufferedReader.readLine()) != null){
  35. String[] datas = line.split("=");
  36. Field field = clazz.getDeclaredField(datas[0]);
  37. field.setAccessible(true);//设置可以访问
  38. if(field.getType() == int.class){
  39. field.set(obj, Integer.parseInt(datas[1]));
  40. }else{
  41. field.set(obj, datas[1]);
  42. }
  43. }
  44. return obj;
  45. }
  46. }
  1. package com.cn.reflect;
  2. public class Person {
  3. private int id;
  4. String name;
  5. public Person(int id, String name) {
  6. this.id = id;
  7. this.name = name;
  8. }
  9. private Person() {
  10. }
  11. public void eat(){
  12. System.out.println(name + "高高兴兴吃饭。。。");
  13. }
  14. public void eat(int num){
  15. System.out.println(name + "高高兴兴吃了" + num + "大碗饭。。。");
  16. }
  17. private void sleep(){
  18. System.out.println(name + "偷偷睡觉。。。");
  19. }
  20. private static void work(){
  21. System.out.println("努力工作。。。");
  22. }
  23. public void sum(int[] arr){
  24. System.out.println("长度是" + arr.length);
  25. }
  26. @Override
  27. public String toString() {
  28. return "编号" + this.id + "\t姓名:" + this.name;
  29. }
  30. }
info.txt文本文件
  1. com.cn.factory.Person
  2. id=110
  3. name=木丁西

二、在web项目中

步骤:
    ①在src下添加配置资源包,例如 instance.properties

     注意:配置文件中类名字符串前面可以有空格,后面不能有,否则会异常找不到类。
     ②写工厂类
  1. package com.cn.factory;
  2. import java.util.ResourceBundle;
  3. /**
  4. * 工厂,创建dao或service实例
  5. * @author liuzhiyong
  6. *
  7. */
  8. public class BeanFactory {
  9. //加载配置文件
  10. private static ResourceBundle bundle;
  11. static{
  12. bundle = ResourceBundle.getBundle("instance");//加载服务器下/hotel/WEB-INF/classes/instance.properties
  13. }
  14. /**
  15. * 根据指定的key,读取配置文件,获取类的全路径,创建对象
  16. * @param <T>
  17. * @param key 配置文件中的key,例如:dao=com.cn.Dao
  18. * @return
  19. */
  20. public static <T> T getInstance(String key, Class<T> clazz){
  21. String className = bundle.getString(key);
  22. try {
  23. return (T) Class.forName(className).newInstance();//反射,创建对象
  24. } catch (Exception e) {
  25. throw new RuntimeException(e);
  26. }
  27. }
  28. }
③web项目中不固定写死的地方,需要创建对象时使用

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值