java反射机制(工厂模式)
http://www.phpddt.com/dhtml/338.html
java里面没有typeof,js有。
我终于实现了用反射机制编写的工厂模式。java反射在工厂模式可以体现。
包含产品接口类,具体产品实现类,工厂类,这三种不同的类型
http://wenku.baidu.com/view/8899ecfff705cc175527094d.html
http://wenku.baidu.com/view/8ceb39c52cc58bd63186bd87.html
http://blog.csdn.net/justinavril/article/details/2873664
http://bbs.csdn.net/topics/60429890
http://www.cnblogs.com/pricks/archive/2009/08/11/1543855.html
http://www.cnblogs.com/bingoidea/archive/2009/06/21/1507889.html
http://www.cnblogs.com/octobershiner/archive/2012/03/18/2404751.html
具体java代码三种实现如下:
1、接口实现
/**
*
*/
package factory.realize1; /**
* @author wangjian2
* 接口
*/
public interface Product {
public String getProductName(String type,int id);
}
package factory.realize1;
public class Route implements Product {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
@Override
public String getProductName(String type, int id) {
return "RouteNameupdate";
}
}
/**
*
*/
package factory.realize1; /**
* @author wangjian2
*
*/
public class Package implements Product { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub } @Override
public String getProductName(String type, int id) {
return "PackageName";
} }
/**
*
*/
package factory.realize1; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; /**
* @author wangjian2
*
*/
public class Factory { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub } public void getName(String type,int id){
if("跟团".equals(type)){
Product prd = new Route();
System.out.println(prd.getProductName("", 0));
}else if ("自助游".equals(type)){
Product prd = new Package();
System.out.println(prd.getProductName("", 0));
}
} /**
* 通过反射将参数传给函数并返回结果
* @param type
* @param id
*/
public void getNameByreflect(String type,int id){
Class<?> cls = null;
try {
//获取指定的任意type的所需类的完全限定名(包名+类名)相关联的class对象
cls = Class.forName("factory.realize1."+type);
//获取类对应的任意方法对象
Method getProductName = cls.getMethod("getProductName", new Class[]{String.class,int.class});
//使用该方法
Object result = getProductName.invoke(cls.newInstance(), new Object[]{new String(type),0});
System.out.println(result);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
*
*/
package factory.realize1; /**
* @author wangjian2
*
*/
public class TestExample { /**
* @param args
*/
public static void main(String[] args) {
Factory factory = new Factory();
factory.getName("跟团", 0);
//反射实现
factory.getNameByreflect("Route", 0);
} }
2、抽象类实现
/**
*
*/
package factory.realize2; /**
* @author wangjian2
* 抽象类
*/
public abstract class Product {
public abstract String getProductName(String type,int id);
}
package factory.realize2;
public class Route extends Product {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
@Override
public String getProductName(String type, int id) {
return "RouteNameupdate";
}
}
/**
*
*/
package factory.realize2; /**
* @author wangjian2
*
*/
public class Package extends Product { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub } @Override
public String getProductName(String type, int id) {
return "PackageName";
} }
/**
*
*/
package factory.realize2; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; /**
* @author wangjian2
*
*/
public class Factory { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub } public void getName(String type,int id){
if("跟团".equals(type)){
Product prd = new Route();
System.out.println(prd.getProductName("", 0));
}else if ("自助游".equals(type)){
Product prd = new Package();
System.out.println(prd.getProductName("", 0));
}
} /**
* 通过反射将参数传给函数并返回结果
* @param type
* @param id
*/
public void getNameByreflect(String type,int id){
Class<?> cls = null;
try {
cls = Class.forName("factory.realize1."+type);
Method getProductName = cls.getMethod("getProductName", new Class[]{String.class,int.class});
Object result = getProductName.invoke(cls.newInstance(), new Object[]{new String(type),0});
System.out.println(result);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
*
*/
package factory.realize2; /**
* @author wangjian2
*
*/
public class TestExample { /**
* @param args
*/
public static void main(String[] args) {
Factory factory = new Factory();
factory.getName("跟团", 0);
factory.getNameByreflect("Route", 0);
} }
3、继承类重写(覆盖)
/**
*
*/
package factory.realize3; /**
* @author wangjian2
* 继承类重写(覆盖)
*/
public class Product {
public String getProductName(String type,int id) {
return null;
}
}
package factory.realize3;
public class Route extends Product {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
@Override
public String getProductName(String type, int id) {
return "RouteNameupdate";
}
}
/**
*
*/
package factory.realize3; /**
* @author wangjian2
*
*/
public class Package extends Product { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub } @Override
public String getProductName(String type, int id) {
return "PackageName";
} }
/**
*
*/
package factory.realize3; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; /**
* @author wangjian2
*
*/
public class Factory { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub } public void getName(String type,int id){
if("跟团".equals(type)){
Product prd = new Route();
System.out.println(prd.getProductName("", 0));
}else if ("自助游".equals(type)){
Product prd = new Package();
System.out.println(prd.getProductName("", 0));
}
} /**
* 通过反射将参数传给函数并返回结果
* @param type
* @param id
*/
public void getNameByreflect(String type,int id){
Class<?> cls = null;
try {
cls = Class.forName("factory.realize1."+type);
Method getProductName = cls.getMethod("getProductName", new Class[]{String.class,int.class});
Object result = getProductName.invoke(cls.newInstance(), new Object[]{new String(type),0});
System.out.println(result);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
*
*/
package factory.realize3; /**
* @author wangjian2
*
*/
public class TestExample { /**
* @param args
*/
public static void main(String[] args) {
Factory factory = new Factory();
factory.getName("跟团", 0);
factory.getNameByreflect("Route", 0); } }
个人理解反射机制是为了开发者方便,减少开发量。
http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html
java反射在工厂模式可以体现
http://blog.csdn.net/ritterliu/article/details/7764849
java反射机制(工厂模式)的更多相关文章
- Java反射+简单工厂模式总结
除了 new 之外的创建对象的方法 通过 new 创建对象,会使得程序面向实现编程,先举个例子,某个果园里现在有两种水果,一种是苹果,一种是香蕉,有客户想采摘园子里的水果,要求用get()方法表示即可 ...
- Java反射机制demo(七)—反射机制与工厂模式
Java反射机制demo(七)—反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...
- Java反射机制在工厂模式中的应用
在本篇文章中就不详细介绍工厂模式,主要介绍一下反射在工厂模式中的使用,让读者对反射机制带来的好处有更深的认识. 首先看一下简单工厂模式 简单工厂模式(simple factory)是类的创建模式,又叫 ...
- Java反射机制与工厂模式
工厂模式属于创建型模式,它提供了一种创建对象的最佳方式. 它的特点是:客户端的程序类不直接牵扯到对象的实例化管理,只与接口发生关联,通过工厂类获取指定接口的实例化对象. 简单工厂模式如下: inter ...
- Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring
IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更 ...
- java学习笔记之反射—反射和工厂模式
简单工厂模式又称为静态工厂方法模式,它是由工厂对象来决定要创建哪一种类的实例化对象. 静态工厂代码: class Factory{ private Factory() {} public static ...
- JAVA反射机制学�
JAVA反射机制:对于随意一个类,都可以知道这个类的全部属性和方法:对于随意一个对象,都可以调用它的随意一个方法和属性:这样的动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. J ...
- 一个例子让你了解Java反射机制
本文来自:blog.csdn.net/ljphhj JAVA反射机制: 通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运 ...
- (转)JAVA反射机制理解
JAVA反射机制: 通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们. 理论的东东太多也没 ...
随机推荐
- 关于委托:异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }
转自:http://www.cnblogs.com/xiaofei59/archive/2010/11/25/1887285.html 异常{ 无法将 匿名方法 转换为类型“System.Delega ...
- PHP程序异常处理实现方法
一个异常(Exception)则是在一个程序执行过程中出现一个例外或是一个事件,它中断了指令的运行,跳转到其他程序模块继续执行.所以异常处理经常被当作程序的控制流程使用.无论是错误还是异常,应用程序都 ...
- XmlHttp对象
我是这样理解XmlHttp对象的:xml是一种文档类型Http可以把它看做是浏览器XmlHttp:可以解释为把xml的内容读到浏览器上(网页上),把这句话封装一下,见下XmlHttp是浏览器对象,起的 ...
- codeforces567E. President and Roads
题目大意:总统要回家,会经过一些街道,每条街道都是单向的并且拥有权值.现在,为了让总统更好的回家,要对每一条街道进行操作:1)如果该街道一定在最短路上,则输出“YES”.2)如果该街道修理过后,该边所 ...
- 在C#中使用属性控件添加属性窗口
转自原文 在C#中使用属性控件添加属性窗口 第一步,创建在应用程序中将要展现的字段属性为public公有属性.其中,所有的属性必须有get和set的方法(如果不设置get方法,则要显示的属性不会显示在 ...
- 【转】Windows平台下Git服务器搭建
Windows平台下Git服务器搭建 Posted on 2015-05-18 21:29 阿祥当码农 阅读(7637) 评论(0) 编辑 收藏 该文章转自:http://www.codeceo.co ...
- Linux——搭建PHP开发环境第一步:apache
原文链接:http://www.2cto.com/os/201511/450258.html ##### Apache 编译安装[root@localhost ~]# yum install gcc ...
- 关于 从别人电脑上 高版本的 Xcode上拷贝过来的项目的 不能运行模拟器的 解决方法
如图 从别人电脑上 拷贝过来的 工程 打开后 点击 iOS Device 只有 一个选项 没有模拟器.这说明 自己的 Xcode 的版本比 创建这个工程所用的版本低.所以 要睇啊你tar ...
- 转:Hprose for php(三)——客户端
文章来自于:http://blog.csdn.net/half1/article/details/21329785 本文将介绍Hprose for php客户端的更多细节. 1.直接通过远程方法名进行 ...
- 软硬大比拼 硅胶、TPU和PC材质对比
手机保护壳的材质有很多种,目前保护壳市场上最为常见的就是硅胶.TPU.PC材质了.那么我们不禁要问,PU.硅胶.PC三材质到底有哪些区别呢?普通消费者在购买保护壳的时候能否从外表就能看出保护壳材质?P ...