简单工厂模式又称为静态工厂方法模式,它是由工厂对象来决定要创建哪一种类的实例化对象。

静态工厂代码:

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学习笔记之反射—反射和工厂模式的更多相关文章

  1. 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)

      抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.对于工厂方法来说,抽象工厂可实现一系列产品的生产,抽象工厂更注重产品的组合. 看代码: 7.1.解释 main(),女 ...

  2. Java学习笔记之使用反射+泛型构建通用DAO

    PS:最近简单的学了学后台Servlet+JSP.也就只能学到这里了.没那么多精力去学SSH了,毕竟Android还有很多东西都没学完.. 学习内容: 1.如何使用反射+泛型构建通用DAO. 1.使用 ...

  3. Java学习笔记54(反射详解)

    反射概念: java反射机制是在运行状态中,对于任意一个类,都能知道所有属性和方法 对于任意一个对象都能调用它的任意一个方法和属性,这种动态获取和调用的功能称为java的反射机制 实际作用: 已经完成 ...

  4. Java学习笔记八(反射)

    1.介绍 反射为Java程序在执行时提供了动态的能力.利用反射能够在执行时对程序进行动态的控制.本篇博客着重解说一下Java中的反射. 2.Class类的使用 在Java执行过程中,每一个类被载入后都 ...

  5. Java学习笔记--注解和反射

    注解和反射 1. 注解 注解作用: 对程序做出解释 被其他程序读取 注解格式: @注释名,还可以添加一些参数值,例如@SuppressWarnings(value="unchecked&qu ...

  6. Java 学习笔记 使用synchronized实现生产者消费者模式

    说明 Object.wait()使当前的线程进入到等待状态(进入到等待队列) Object.notifyAll() 唤醒等待中的全部线程 Object.notify() 随机唤醒一个线程 代码 con ...

  7. JAVA学习笔记—review基本知识[反射与异常]

    JAVA学习笔记—review基本知识[反射与异常] 1.异常: 1.1异常的分类: Java会将所有的异常封装成对象,其根本父类为Throwable. Throwable有两个子类:Error 和E ...

  8. Java反射机制demo(七)—反射机制与工厂模式

    Java反射机制demo(七)—反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...

  9. Laravel学习笔记之PHP反射(Reflection) (上)

    Laravel学习笔记之PHP反射(Reflection) (上) laravel php reflect 2.1k 次阅读  ·  读完需要 80 分钟 3 说明:Laravel中经常使用PHP的反 ...

  10. [Java反射机制]用反射改进简单工厂模式设计

    如果做开发的工作,工厂设计模式大概都已经深入人心了,比较常见的例子就是在代码中实现数据库操作类,考虑到后期可能会有数据库类型变换或者迁移,一般都会对一个数据库的操作类抽象出来一个接口,然后用工厂去获取 ...

随机推荐

  1. Nginx 十大优化 与 防盗链

    Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Ngin ...

  2. 编译安装php依赖软件libiconv-1.14报错及其解决办法

    make && make install报如下错误: ./stdio.h:1010:1: 错误:‘gets’未声明(不在函数内) _GL_WARN_ON_USE (gets, &quo ...

  3. [Python]判断变量类型是否为List列表

    用法:isinstance(变量,list) li = [1,2,3] print(type(li)) if isinstance(li,list): print("This is a Li ...

  4. Danganronpa 水题。

    Danganronpa Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  5. get、post请求参数乱码解决方法(qq:1324981084)

    java高级架构师全套vip教学视频,需要的加我qq1324981084 在实际的项目中我们会遇见中文乱码的问题,这个问题是很恶心的事,所以我在这里提供了一些解决中文乱码的方法,希望能给大家一些帮助. ...

  6. 手把手教你搭建 ELK 实时日志分析平台

    本篇文章主要是手把手教你搭建 ELK 实时日志分析平台,那么,ELK 到底是什么呢? ELK 是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch.Logstash 和 Kiban ...

  7. 「Kafka」Kafka中offset偏移量提交

    在消费Kafka中分区的数据时,我们需要跟踪哪些消息是读取过的.哪些是没有读取过的.这是读取消息不丢失的关键所在. Kafka是通过offset顺序读取事件的.如果一个消费者退出,再重启的时候,它知道 ...

  8. Python基础知识总结笔记(四)函数

    Python基础知识总结笔记(四)函数python中的函数函数中的参数变量作用域偏函数PFA递归函数高阶函数BIFs中的高阶函数匿名函数lambda闭包Closure装饰器Decorator函数式编程 ...

  9. 深度(deepin)系统不能ssh root用户登录

    vi /etc/ssh/sshd_config找到这一部分信息刚进去信息应该是这样 # Authentication: #LoginGraceTime 2m #PermitRootLogin proh ...

  10. qt creator源码全方面分析(2-4)

    目录 Qt Creator API Reference 库 核心库 其他库 插件 Qt Creator API Reference Qt Creator的核心基本上只是一个插件加载器.所有功能都在插件 ...