码迷,mamicode.com
首页 > 其他好文 > 详细

反射与工厂设计模式

时间:2017-09-03 23:35:56      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:logs   abstract   ring   err   return   pack   instant   classname   string   

/*
   通过反射技术改进的工厂,不再使用new关键字来实例化对象了
*/
package com.reflect.factory.model;

interface IFruit {
    public abstract void eat();
}
class Apple implements IFruit{
    @Override
    public void eat() {
       System.out.println("【Apple】吃苹果");
    }
}

class Factory {
    private Factory(){}
    public static  IFruit getInstance(String className){        
        IFruit fruit = null; 
        try {
                         //获取到Class类对象
            Class<?> clazz = Class.forName(className);
                        //通过Class对象实例化对象,但不再用new关键字
            fruit=(IFruit)clazz.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        } 
        return fruit;
    }    
}
public class TestDemo {
    public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException {
          IFruit fruit = Factory.getInstance("com.reflect.factory.model.Apple");
          fruit.eat();
    }
}
/*
   上面这个工厂类存在一个缺陷,目前只能产生IFruit的实例化对象,
   如果需要生成其它类的实例化对象,就需要重新创建一个工厂

   如何解决这个问题呢?
      我们可以使用泛型来解决这个缺陷:
      改进版工厂类如下:
*/
class Factory {
    private Factory(){}
    public static <T> T getInstance(String className){
        T obj = null; 
        try {
            Class<?> clazz = Class.forName(className);
            obj=(T)clazz.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        } 
        return obj;
    }    
}

 

反射与工厂设计模式

标签:logs   abstract   ring   err   return   pack   instant   classname   string   

原文地址:http://www.cnblogs.com/yuefeng123/p/7471281.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!