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

静态工厂代码:

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. KVM性能优化之CPU优化

    前言 任何平台根据场景的不同,都有相应的优化.不一样的硬件环境.网络环境,同样的一个平台,它跑出的效果也肯定不一样.就好比一辆法拉利,在高速公路里跑跟乡村街道跑,速度和激情肯定不同... 所以,我们做 ...

  2. C#中HashSet的重复性与判等运算重载

    目录 一个故事-- 一个繁荣的遥远国度:泛型容器 但是我也不确定容器里能放些什么东西啊 一个英勇的皇家骑士:HashSet 值类型的HashSet 引用类型的HashSet 另外一个--故--事?? ...

  3. textarea 标签

    textarea 标签 -- 代表HTML表单多行输入域 textarea标签是成对出现的,以<textarea>开始,以</textarea>结束 属性: Common -- ...

  4. getElementsByName和getElementById获取控件

    js对控件的操作通常使用getElementsByName或getElementById来获取不同的控件进行操作 getElementsByName() 得到的是一个array, 不能直接设value ...

  5. 国产安全自主可控IT智能运维管理解决方案

    新一轮科技革命和产业变革席卷全球,大数据.云计算.物联网.人工智能.区块链等新技术不断涌现,数字经济正深刻地改变着人类的生产和生活方式,作为经济增长新动能的作用日益凸显.伴随增长的,还有网络中不断涌现 ...

  6. C#设计模式学习笔记:(13)模板方法模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7837716.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第一个模式--模 ...

  7. Redis实现访问控制频率

    为什么限制访问频率 做服务接口时通常需要用到请求频率限制 Rate limiting,例如限制一个用户1分钟内最多可以范围100次 主要用来保证服务性能和保护数据安全 因为如果不进行限制,服务调用者可 ...

  8. 使用Teigha.net读取CAD的常用功能模块

    Teigha中实体旋转 代码: using (var trans = database.TransactionManager.StartTransaction()) { Entity ent = tr ...

  9. 有关鼠标在页面body获取点击事件的问题

    首先说到这个问题我们先来谈谈body的高度问题,关于body高度的设置. 有些小伙伴可能就会说这个是多么的简单,直接进行如下操作不就可以了 body{ height:100%; } 这个设置虽然是想法 ...

  10. ES6中Set和WeakSet

    Set(放数组,不能重复) 会自动去重,有4个元素,但是打印出来只有三个 let setArr=new Set(['zhang','huan','eternity','zhang']); consol ...