反射与工厂模式实现IOC
不用反射机制的工厂模式(代码)
interface fruit{<br> public abstract void eat();<br>} <br>class Apple implements fruit{<br> public void eat(){<br> System.out.println("Apple");<br> }<br>} <br>class Orange implements fruit{<br> public void eat(){<br> System.out.println("Orange");<br> }<br>}<br>//构造工厂类<br>//也就是说以后如果我们在添加其他的实例的时候只需要修改工厂类就行了<br>class Factory{<br> public static fruit getInstance(String fruitName){<br> fruit f=null;<br> if("Apple".equals(fruitName)){<br> f=new Apple();<br> }<br> if("Orange".equals(fruitName)){<br> f=new Orange();<br> }<br> return f;<br> }<br>}<br>class hello{<br> public static void main(String[] a){<br> fruit f=Factory.getInstance("Orange");<br> f.eat();<br> }<br>}<br>
使用反射机制
interface fruit{<br> public abstract void eat();<br>}<br>class Apple implements fruit{<br>public void eat(){<br> System.out.println("Apple");<br> }<br>}<br>class Orange implements fruit{<br>public void eat(){<br> System.out.println("Orange");<br> }<br>}<br>class Factory{<br> public static fruit getInstance(String ClassName){<br> fruit f=null;<br> try{<br> f=(fruit)Class.forName(ClassName).newInstance();<br> }catch (Exception e) {<br> e.printStackTrace();<br> }<br> return f;<br> }<br>}<br>class hello{<br> public static void main(String[] a){<br> fruit f=Factory.getInstance("Reflect.Apple");<br> if(f!=null){<br> f.eat();<br> }<br> }<br>}<br>
反射机制并结合属性文件的工厂模式(即IOC)
首先创建一个fruit.properties的资源文件:<br><br>apple=Reflect.Apple<br>orange=Reflect.Orange<br><br>然后编写主类代码:<br>interface fruit{<br> public abstract void eat();<br>}<br>class Apple implements fruit{<br> public void eat(){<br> System.out.println("Apple");<br> }<br>}<br>class Orange implements fruit{<br> public void eat(){<br> System.out.println("Orange");<br> }<br>}<br>//操作属性文件类<br>class init{<br> public static Properties getPro() throws FileNotFoundException, IOException{<br> Properties pro=new Properties();<br> File f=new File("fruit.properties");<br> if(f.exists()){<br> pro.load(new FileInputStream(f));<br> }else{<br> pro.setProperty("apple", "Reflect.Apple");<br> pro.setProperty("orange", "Reflect.Orange");<br> pro.store(new FileOutputStream(f), "FRUIT CLASS");<br> }<br> return pro;<br> }<br>}<br>class Factory{<br> public static fruit getInstance(String ClassName){<br> fruit f=null;<br> try{<br> f=(fruit)Class.forName(ClassName).newInstance();<br> }catch (Exception e) {<br> e.printStackTrace();<br> }<br> return f;<br> }<br>}<br>class hello{<br> public static void main(String[] a) throws FileNotFoundException, IOException{<br> Properties pro=init.getPro();<br> fruit f=Factory.getInstance(pro.getProperty("apple"));<br> if(f!=null){<br> f.eat();<br> }<br> }<br>}<br>
IOC框架使用需要注意的点
1)软件系统中由于引入了第三方IOC容器,生成对象的步骤变得有些复杂,本来是<br>两者之间的事情,又凭空多出一道手续,所以,我们在刚开始使用IOC框架的时候,<br>会感觉系统变得不太直观。所以,引入了一个全新的框架,就会增加团队成员学习和<br>认识的培训成本,并且在以后的运行维护中,还得让新加入者具备同样的知识体系。<br>
2)由于IOC容器生成对象是通过反射方式,在运行效率上有一定的损耗。如果你要追<br>求运行效率的话,就必须对此进行权衡。<br>
3)具体到IOC框架产品(比如Spring)来讲,需要进行大量的配制工作,比较繁琐,<br>对于一些小的项目而言,客观上也可能加大一些工作成本。<br>
4)IOC框架产品本身的成熟度需要进行评估,如果引入一个不成熟的IOC框架产品,<br>那么会影响到整个项目,所以这也是一个隐性的风险。<br>