工厂模式

package cn.itcast.factory;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

import cn.itcast.reflect.Person;

/**
 * 工厂设计模式就是用于产生对象的.
 * @author zhongzh
 *
 */
class Car{}
class BMW extends Car{}
class BSJ extends Car{}
public class Demo1 {

   public static Car getInstance(int num){//工厂方法,这个方法专门用于产生对象的.
       //专门用于生产对象的方法就是工厂方法.
       if(num==0){
           return new BMW();
       }else{
           return new BSJ();
       }
   }
   //#以后配置信息都是写在XML文件上的.
   public static void main(String[] args) throws Exception {
      //你那工厂方法是根据我的配置文件生成对象的,任何对象都可以帮我创建.
      //工厂方法能生成任意的对象.只要你在配置文件能写,我就能创建.
      Person p = (Person) getInstance();
      System.out.println(p);
}
   //需求:编写一个工厂方法根据配置文件返回对应的对象.
   //这个工厂方法可以产生任意的对象.除了反射别无他径.这就是反射的应用.
   //如果想写通用的东西,通用的工具给别人使用,反射是必不可少的.
   //任意的对象都可以帮我们随意的生成.
   public static Object getInstance() throws Exception{//根据配置文件生成对应的对象,其实工厂方法是通用的.
    //通用的东西缺少不了反射.   
       //FileReader fileReader = new FileReader("info.txt");//相对路径,文件在工程下
       //读取配置文件
       BufferedReader bufferedReader = new BufferedReader(new FileReader("info.txt"));
       //读取第一行:读取类文件的信息.
       //第一行是你要创建哪个类的对象.
       //任何一个框架你都要学它的语法,这个语法就是它要定义的规则.任何一个框架都有它的规则.
       //所以我要求第一行必须写完整的类名,它不写的话可以啊,你不用我的东西呗.
       String className = bufferedReader.readLine();
       //通过完整类名获取对应的Class对象
       Class clazz = Class.forName(className);//在这里只能读字符串然后获取对应的字节码
       
       //clazz.getConstructor(null);//有了字节码之后你就可以创建对象了.获取到对应的构造方法.
       //没有无参的构造方法也不行.我在定义规则.以后你用Spring也是这样,别人也会这样要求你的,你也是必须
       //得有构造方法.
       Constructor constructor = clazz.getDeclaredConstructor(null);//防止它私有
       
       
       constructor.setAccessible(true);
       Object o = constructor.newInstance(null);
       //给对象设置对应的属性值
       String line = null;
       while((line = bufferedReader.readLine())!=null){
           //一行有属性名,也有属性值,切割呗
          String datas[] =  line.split("=");
          Field field = clazz.getDeclaredField(datas[0]);//防止它私有,getDeclaredField
          //设置它可以访问
          field.setAccessible(true);
          if(field.getType()==int.class){
              field.set(o, Integer.parseInt(datas[1]));
          }else{
              field.set(o, datas[1]);
          }
       }
   return o;
   }
   
}
cn.itcast.reflect.Person
id=110
name=旺财
package cn.itcast.reflect;

import java.lang.reflect.Field;

/**
 * 通过反射获取对应的成员变量
 * 
 * 在反射技术中使用了Field类描述了成员变量的。
 * 
 * @author zhongzh
 *
 */
public class Demo4 {
public static void main(String[] args) throws Exception {
    //获取到对应的Class对象
    Class clazz = Class.forName("cn.itcast.reflect.Person");
    //获取到所有的成员变量
    //Field[]    fields  =       clazz.getFields();//getFields()是获取公共的属性
/*    Field[]    fields  =       clazz.getDeclaredFields();//getFields()是获取公共的属性
    for (Field field : fields) {
        System.out.println(field);
    }*/
     Person p = new Person();
     Field field = clazz.getDeclaredField("id");
     //设置访问权限可以访问
     field.setAccessible(true);
     field.set(p,110);//set基本上是万能的.第一个参数:你是不是要给对象才能设置这个成员变量 设置该数据  的成员变量,第二个参数:属性值.
     System.out.println(p);


}

    
}
package cn.itcast.reflect;

public class Person {
    
    private int id;
     //int id;//默认是私有的
    //public int id;//默认是私有的
    
    String name;
    
    public Person(int id,String name){
        this.id = id;
        this.name = name;
    }
    
    public Person(){}
    
    
    public void eat(int num){
        System.out.println(name+"吃很"+num+"斤饭");
    }
    
    private static void sleep(int num){
        System.out.println("明天睡上"+num+"小时");
    }
    
    
    public static void  sum(int[] arr){
        System.out.println("长度是:"+ arr.length);
    }
    
    
    @Override
    public String toString() {
        return " 编号:"+ this.id +" 姓名:"+ this.name;
    }
    
}
原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/6734461.html