zoukankan      html  css  js  c++  java
  • 工厂模式

    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;
        }
        
    }
  • 相关阅读:
    重构改善既有代码设计--重构手法19:Replace Data Value with Object (以对象取代数据值)
    重构改善既有代码设计--重构手法18:Self Encapsulate Field (自封装字段)
    重构改善既有代码设计--重构手法16:Introduce Foreign Method (引入外加函数)&& 重构手法17:Introduce Local Extension (引入本地扩展)
    重构改善既有代码设计--重构手法15:Remove Middle Man (移除中间人)
    重构改善既有代码设计--重构手法14:Hide Delegate (隐藏委托关系)
    JAVA设计模式:蝇量模式
    JAVA设计模式:桥接模式
    重构改善既有代码设计--重构手法13:Inline Class (将类内联化)
    leetcode-485-Max Consecutive Ones
    leetcode-475-Heaters
  • 原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/6734461.html
Copyright © 2011-2022 走看看