将反射应用在工厂模式上
来源:互联网 发布:2016年中国零售业数据 编辑:程序博客网 时间:2024/06/08 15:21
一、将反射应用在工厂模式上
工厂设计模式在实际的开发中使用得非常多,之前读者已经学习过简单的工厂模式,通过简单的工厂设计模式可以达到类的 解耦合目的,但是之前的工厂设计模式依然存在问题,那就是在增加一个子类时都需要修改工厂类,这样很麻烦。现在就可以通过反射机制修改工厂类,这样肯定会 非常麻烦。学习完反射机制之后,实际上,此时就可以通过反射机制来改善工厂类,让其在增加子类时可以不用做任何的修改,就能达到功能的扩充,如下:
例:使用反射完成工厂设计
package org.lxh.demo15.factorydemo;
interface Fruit { //水果接口
public void eat() ; //吃水果
}
class Apple implements Fruit{ //定义苹果
public void eat() {
System.out.println("**吃苹果。");
}
}
class Orange implements Fruit{
public void eat() {
System.out.println("**吃橘子。");
}
}
class Factory{
public static Fruit getInstance(String className){
Fruit fruit = null ;
try{
fruit = (Fruit) Class.forName(className).newInstance() ;
}catch(Exception e ){
e.printStackTrace() ;
}
return fruit ;
}
}
public class FactoryDemo{
public static void main(String args[]){
//通过工厂类取得接口实例,传入完整的包.类名称
Fruit f = Factory.getInstance("org.lxh.demo15.factorydemo.Apple") ;
if(f!=null){ //判断是否取得接口实例
f.eat() ;
}
}
}
输出:
**吃苹果。
以上的工厂操作类中使用了反射操作取得Fruit实例,这样无论增加多少个子类,工厂类都不用做任何的修改。
二、结合属性文件的工厂模式
以上操作代码虽然可以通过反射取得接口的实例,但是在操作时需要传入完整的包.类名称,而且用户也无法知道一个接口有多少个可以使用的子类,所以此时可以通过属性文件的形式配置所要的子类信息。
例:属性文件fruit.properties
apple = org.lxh.demo15.factorydemo02.Apple
orange = org.lxh.demo15.factorydemo02.Orange
在属性文件中使用apple和orange表示完整的包.类名称,这样在使用时直接通过属性名称即可。
例:属性操作类
class Init{
public static Properties getPro(){
Properties pro = new Properties() ;
File f = new File("d:\\fruit.properties") ;
try{
if(f.exists()){ //属性文件中已存在
pro.load(new FileInputStream(f)) ;//读取属性
}else{ //建立一个新的属性文件,同时设置好默认内容
pro.setProperty("apple", "org.lxh.demo15.factorydemo02.Apple") ;
pro.setProperty("orange", "org.lxh.demo15.factorydemo02.Orange") ;
pro.store(new FileOutputStream(f), "FRUIT CLASS") ;
}
}catch(Exception e){
e.printStackTrace() ;
}
return pro ;
}
}
此类中的主要功能是取得属性文件中的配置信息,如果属性文件不存在,则创建一个新的,并设置默认值。
例:测试程序
public class FactoryDemo02 {
public static void main(String args[]){
Properties pro = Init.getPro() ;
//通过工厂类取得接口实例,通过属性的key传入完整的包.类名称
Fruit f = Factory.getInstance(pro.getProperty("apple")) ;
if(f!=null){
f.eat() ;
}
}
}
在通过工厂类取得接口实例时,直接输入属性的key就可以找到其完整的包.类名称,以达到对象的实例化功能。
在本程序中可以发现,程序很好地实现了代码与配置的分离。通过配置文件配置要使用的类,之后通过程序读取配置文件,以完成具体的功能,如下。当然,这些程序完成的前提是基于接口,所以接口在实际开发中用处是最大的。
(配置文件决定程序的运行)
程序 ---> 程序代码 -- 运行时读取属性文件以 --> 配置文件 (保存程序运行的相关信息)
找到相应的配置信息
图,代码与文件相分离
本章要点
1、Class类是反射机制操作的源头。
2、Class类的对象有3种实例化方式:
(1)通过Object类中的getClass()方法。
(2)通过“类.class”的形式
(3)通过Class.forName()方法,此种方式最为常用。
3、可以通过Class类中的newInstance()方法进行对象的实例化操作,但是要求类中必须存在无参构造方法,如果类中没有无参构造,则必须使用Constructor类完成对象的实例化操作。
4、可以通过反射取得一个类所继承的父类、实现的接口、类中的全部构造方法、全部普通方法及全部属性。
5、使用反射机制可以通过Method调用类中的方法,也可以直接操作类中的属性。
6、动态代理可以解决开发中代理类过多的问题,提供统一的代理功能实现。
7、在程序的开发中使用反制机制并结合属性文件,可以达到程序代码与配置文件相分享的目的。
- 将反射应用在工厂模式上
- [转]反射在工厂模式上的应用
- 动态代理及反射在工厂模式上的应用
- 将反射用于工厂模式
- 将反射用于工厂模式
- 将反射用于工厂模式
- C# 反射在工厂设计模式中的应用
- 浅析Command模式,反射工厂在系统中的应用
- 反射技术在工厂设计模式中的应用
- Java反射机制在工厂模式中的应用
- java反射机制在工厂模式中的应用
- Java反射的工厂模式应用
- JavaSE020_反射应用之工厂模式
- java反射机制工厂模式的应用
- java 反射解析,将反射用于工厂模式【实例】
- 简单工厂模式、工厂模式、抽象工厂模式 与反射技术应用
- 【设计模式】工厂模式结合反射技术的简单应用
- 使用简单工厂模式,解析XML文件,并将数据显示在treeview上
- javascript onkeydown事件
- 随机产生十个数并排序
- YOLO: Real-Time Object Detection
- 微信退款curl错误
- 使用RecyclerView替代ListView(一)
- 将反射应用在工厂模式上
- 一个js引发的血案
- siteMesh之decorator的使用
- 随机产生一百个数排序
- React
- cdm ldm pdm 区别、转化
- Notification使用详解之一:基础应用
- hash_map中string为key的解决方法
- Service的一点心得