java学习笔记之反射—反射和工厂模式
简单工厂模式又称为静态工厂方法模式,它是由工厂对象来决定要创建哪一种类的实例化对象。
静态工厂代码:
class Factory{
private Factory() {}
public static IMessage getInstance(String className) {
if("NetMessage".equals(className)) {
return new NetMessage();return null;
}
}
子类和父接口的定义:
interface IMessage{
public void send();
}
class NetMessage implements IMessage{
@Override
public void send() {}
}
class CloudMessage implements IMessage{
@Override
public void send() {}
}
在这段代码之中,当传入的参数是“NetMessage”的时候,就返回一个NetMessage类的实例化对象,否则就返回null,代码很简单明了,但是该工厂只能创建NetMessage类的对象,当我有更多的类需要工厂去创建对象时,我就必须对工厂类进行修改,比如下面这段代码。
class Factory{
private Factory() {}
public static IMessage getInstance(String className) {
if("NetMessage".equals(className)) {
return new NetMessage();
}else if("CloudMessage".equals(className)) {
return new CloudMessage();
}
return null;
}
}
我希望工厂类可以创建CloudMessage类的对象,所以我对工厂类进行了以上的修改。但如果需要实例化的类的越来越多,难道我要不停的修改我的工厂类吗?这样未免太过麻烦。我每次增加一个类都要在工厂类里面多添加一个判断语句,但是如果我在工厂类里面通过反射进行对象实例化就可以解决这个问题。
反射与工厂模式相结合:
class Factory{
private Factory() {}
/**
* 获取接口实例化对象
* @param className 接口的子类
* @return 如果子类存在则返回指定接口实例化对象
*/
@SuppressWarnings("unchecked")
public static IMessage getInstance(String className) {
IMssage instance = null;
try {
instance = (IMssage) Class.forName(className).getDeclaredConstructor().newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return instance;
}
}
在工厂类中使用反射操作,这样一来,无论有多少种类,工厂类都不需要进行修改。但是这种工厂模式依然存在缺点,该工厂只能对IMesaage接口子类进行实例化,如果一个类没有实现该接口则无法通过工厂进行对象实例化。而代码之中可能存在不同的接口,为了解决这一问题,可以在工厂类之中使用泛型。
代码:
//利用反射机制实现的工厂设计模式最大的优势在于,对于接口子类的扩充不再影响工厂类的定义
class NewFactory{
private NewFactory() {}
/**
* 获取接口实例化对象
* @param className 接口的子类
* @param clazz 描述的是一个接口的类型
* @return 如果子类存在则返回指定接口实例化对象
*/
@SuppressWarnings("unchecked")
public static <T>T getInstance(String className,Class<T> clazz) {
T instance = null;
try {
instance = (T) Class.forName(className).getDeclaredConstructor().newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return instance;
}
}
这样一来,接口之类的扩充不再影响工厂类的定义,无论是哪一个接口的子类,都可以通过该工厂类进行对象的创建。
java学习笔记之反射—反射和工厂模式的更多相关文章
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.对于工厂方法来说,抽象工厂可实现一系列产品的生产,抽象工厂更注重产品的组合. 看代码: 7.1.解释 main(),女 ...
- Java学习笔记之使用反射+泛型构建通用DAO
PS:最近简单的学了学后台Servlet+JSP.也就只能学到这里了.没那么多精力去学SSH了,毕竟Android还有很多东西都没学完.. 学习内容: 1.如何使用反射+泛型构建通用DAO. 1.使用 ...
- Java学习笔记54(反射详解)
反射概念: java反射机制是在运行状态中,对于任意一个类,都能知道所有属性和方法 对于任意一个对象都能调用它的任意一个方法和属性,这种动态获取和调用的功能称为java的反射机制 实际作用: 已经完成 ...
- Java学习笔记八(反射)
1.介绍 反射为Java程序在执行时提供了动态的能力.利用反射能够在执行时对程序进行动态的控制.本篇博客着重解说一下Java中的反射. 2.Class类的使用 在Java执行过程中,每一个类被载入后都 ...
- Java学习笔记--注解和反射
注解和反射 1. 注解 注解作用: 对程序做出解释 被其他程序读取 注解格式: @注释名,还可以添加一些参数值,例如@SuppressWarnings(value="unchecked&qu ...
- Java 学习笔记 使用synchronized实现生产者消费者模式
说明 Object.wait()使当前的线程进入到等待状态(进入到等待队列) Object.notifyAll() 唤醒等待中的全部线程 Object.notify() 随机唤醒一个线程 代码 con ...
- JAVA学习笔记—review基本知识[反射与异常]
JAVA学习笔记—review基本知识[反射与异常] 1.异常: 1.1异常的分类: Java会将所有的异常封装成对象,其根本父类为Throwable. Throwable有两个子类:Error 和E ...
- Java反射机制demo(七)—反射机制与工厂模式
Java反射机制demo(七)—反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...
- Laravel学习笔记之PHP反射(Reflection) (上)
Laravel学习笔记之PHP反射(Reflection) (上) laravel php reflect 2.1k 次阅读 · 读完需要 80 分钟 3 说明:Laravel中经常使用PHP的反 ...
- [Java反射机制]用反射改进简单工厂模式设计
如果做开发的工作,工厂设计模式大概都已经深入人心了,比较常见的例子就是在代码中实现数据库操作类,考虑到后期可能会有数据库类型变换或者迁移,一般都会对一个数据库的操作类抽象出来一个接口,然后用工厂去获取 ...
随机推荐
- yum 升级php版本
centos默认安装的php都是 5.3的 ,现在需要 5.6以上的版本 手动安装比较麻烦,直接用yum升级了. 一.准备工作 首先检查当前php版本 #php -v 查看安装的php扩展包 #yu ...
- 使用mysqlfrm恢复frm表结构的方法
1.mysqlfrm安装 由于mysqlfrm是mysql-utilities工具一部分,那么我们安装mysql-utilities即可,下载好对应的源码包,进行编译安装 shell> wget ...
- [Memcached]操作
telnet连接memcached 查看端口是否可访问 # telnet 172.16.1.1 11211 Trying 172.16.1.1... Connected to 172.16.1.1. ...
- 部署LAMP环境搭建一个网站论坛平台
修改主机名 Hostname openstack-001 Hostname Login 修改本地域名解析 Vi /etc/hosts 最后一行添加 192.168.1.56 openstack-001 ...
- 不会用数据可视化大屏?一招教你轻松使用数据可视化BI软件创建农业公司运营数据分析大屏
灯果数据可视化BI软件是新一代人工智能数据可视化大屏软件,内置丰富的大屏模板,可视化编辑操作,无需任何经验就可以创建属于你自己的大屏.大家可以在他们的官网下载软件. 本文以农业公司运营数据分析大屏 ...
- 算法训练 最大获利 注意数据规模(long long)
资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 Chakra是一位年轻有为的企业家,最近他在进军餐饮行业.他在各地开拓市场,共买下了N个饭店.在初期的市场调研中,他将一天划分为M ...
- Asp.Net Core 3.1 集成Swagger
引入Nuget包 Swashbuckle.AspNetCore.SwaggerGen Swashbuckle.AspNetCore.SwaggerUI 配置Startup 配置ConfigureSer ...
- java动态拼接sql语句并且执行时给sql语句的参数赋值
问题 在这里举一个例子,比如我要做一个多条件模糊查询,用户输入的时候有可能输入一个条件,也有可能输入两个条件,这时执行查询的sql语句就不确定了,但可以用动态拼接sql语句来解决这个问题. 解决方法 ...
- Pycharm每次新建工程都要重新安装相关库的解决办法
之前自己每次重建工程时,都不厌其烦的重新安装了第三方的库,直接在pycharm的terminal中利用pip安装,或者鼠标放在所需库的红色波浪线上 直接点击Install Package XXX 后面 ...
- LeetCode 面试题 02.07. 链表相交
题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci/ 给定两个(单向)链表,判定它们是否相交并返回交 ...