Java反射机制在工厂模式中的应用
在本篇文章中就不详细介绍工厂模式,主要介绍一下反射在工厂模式中的使用,让读者对反射机制带来的好处有更深的认识。
首先看一下简单工厂模式
简单工厂模式(simple factory)是类的创建模式,又叫静态工厂方法(static factory method)模式。
简单工厂模式就是由一个工厂类根据传入的参数决定创建哪一种的产品类。
简单工厂模式实例:
//动物接口
interface Animal{
public void speak();
}
//人实现类
class Man implements Animal{
@Override
public void speak() {
System.out.println("我是人我会说话:哈哈哈!!!");
}
}
//狗实现类
class Dog implements Animal{
@Override
public void speak() {
System.out.println("我是小狗不会说话:汪汪汪!!!");
}
}
//工厂类
class Factory{
public Animal getAnimal(String name){
if("man".equals(name)){
return new Man();
}else{
return new Dog();
}
}
}
//测试类
public class GeneralFactory {
public static void main(String[] args){
Factory factory = new Factory();
Animal an = factory.getAnimal("dog");
an.speak();
}
}
输出结果:
我是小狗不会说话:汪汪汪!!!
上面代码中,定义了一个动物(Animal)接口,接着分别定义了人(Man)和狗(Dog)实现类,实现了speak()说话的方法。
如果我们现在不用工厂模式,在调用人的说话方法时需要new一个人(Man)的对象,使用狗的说话方式时,需要new一个狗(Dog)类的对象。
这样在new对象时,就需要考虑到接口和子类的实现方式,增加了代码的耦合度。在代码中使用new操作其实也是一种硬编码方式。
使用简单工厂模式解决这个问题(上面的代码),封装一个工厂类,把new对象的操作放在这个工厂类中,这样我们在调用子类里面的方法时,并不需要考虑子类的实现方式,只需要调用工厂类,让工厂类给我们实现new对象的过程,使子类与外界操作没有联系,降低代码耦合性。
大家应该也发现了简单工厂模式有个很大的弊端,就是现在要实现很多动物的speak()方法,那么工厂类里面就要不断的添加new对象的操作,修改里面的代码,很显然这样并没有达到我们理想的要求。可以使用Java的反射机制来解决。
采用反射机制的简单工厂模式实例:
package com.qcjy.factory; //动物接口
interface Animal1{
public void speak();
}
//人实现类
class Man1 implements Animal{
@Override
public void speak() {
System.out.println("我是人我会说话:哈哈哈!!!");
}
}
//狗实现类
class Dog1 implements Animal{
@Override
public void speak() {
System.out.println("我是小狗不会说话:汪汪汪!!!");
}
}
//工厂类
class Factory1{
public Object getAnimal(String className) throws Exception{
Class<?> cls = Class.forName(className);
Object obj = cls.newInstance();
return obj;
}
}
//测试类
public class ReflectFactory {
public static void main(String[] args) throws Exception{
Factory1 factory = new Factory1();
Animal an = (Animal)factory.getAnimal("com.qcjy.factory.Man1");
an.speak();
}
}
输出结果:
我是人我会说话:哈哈哈!!!
采用反射后,无论添加多少个子类,工厂类中的代码都不需要修改,只需要在操作的时候传入子类的类路径(包.类)就可以了,实现了各个业务逻辑之间的完全分离,代码耦合性进一步降低,很好的解决了上面的问题。
看到这里,大家应该体会到了反射机制给我带来的方便了吧,哈哈!
PS:工厂模式分为简单工厂模式、工厂方法模式、抽象工厂模式。简单工厂模式是对代码的自然封装,比较容易理解,几乎每个人都会用的上。真正算的上设计模式的是抽象工厂模式,但是大部分人都很少能用上抽象工厂模式。Spring框架中的IOC用到的就是简单工厂模式。
https://blog.csdn.net/mlc1218559742/article/details/52763392
Java反射机制在工厂模式中的应用的更多相关文章
- Java反射机制与工厂模式
工厂模式属于创建型模式,它提供了一种创建对象的最佳方式. 它的特点是:客户端的程序类不直接牵扯到对象的实例化管理,只与接口发生关联,通过工厂类获取指定接口的实例化对象. 简单工厂模式如下: inter ...
- Java反射机制在代理模式中的使用
代理模式的核心思路就是一个接口有两个子类,一个子类完成核心的业务操作,另一个子类完成与核心业务有关的辅助性操作. 代理模式分为静态代理模式和动态代理模式. 静态代理模式: //接口类 interfa ...
- Java反射机制demo(七)—反射机制与工厂模式
Java反射机制demo(七)—反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...
- 基于C#反射机制的工厂模式
简单介绍 反射提供了描写叙述程序集.模块和类型的对象(Type 类型). 能够使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或訪问其字段和属性. 假设代码中使用了特 ...
- Java反射机制在Spring IOC中的应用
反射的定义: 反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作.例如它允许一个java的类获取它所有的成员变量和方法并且显示出来. 反射机制的 ...
- java中的反射机制在Android开发中的用处
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...
- Java反射机制及IoC原理
一. 反射机制概念 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义.在java中,只要给定类的名字, 那么就可以通 ...
- [转]Java反射机制详解
目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实例化Class类对象 ·获取一个对象的父类与实现的接口 ·获取某个类中的全部构造函数 - 详 ...
- Java反射机制Reflection
Java反射机制 1 .class文件 2 Class类 3 Class类与反射机制 4 Java反射机制的类库支持及简介 5 反射机制的定义与应用 6 反射机制Demo Java反射机制demo(一 ...
随机推荐
- Thinkphp学习笔记3-前置和后置操作
前置和后置操作指的是在执行某个操作方法之前和之后会自动调用的方法,不过仅对访问控制器有效. 其他的分层控制器层和内部调用控制器的情况下前置和后置操作是无效的. 系统会检测当前操作是否具有前置和后置操作 ...
- ssh 的安装
新安装的ubuntu 虚拟机,没有ssh时(ssh 连接不上),时ssh服务没装. 安装openssh-server,就可以. ------------------------------------ ...
- 让Netty入门变得简单
让Netty入门变得简单 https://mp.weixin.qq.com/s/MBnbLmCmFJo0QK9WNwXrXQ 如果先启动nettyClient就不会有nettyServer输出了: p ...
- Linux下双物理网卡设置成虚拟网卡
为了提供网络的高可用我们须要将多块网卡绑定设置成一块虚拟的网卡对外提供服务,这样能够防止一块网卡损坏或者防止网线连接故障造成的连接中断. 以下我们使用eth0与eth1来虚拟成为bond0为例:--- ...
- onvif获取摄像头的流媒体地址完整流程
linux设备上的Onvif 实现6:获取摄像头的流媒体地址完整流程 整体流程: Probe: 发现网络摄像头,获取webserver地址 http://192.168.15.240/onvif/de ...
- Python 面向对象编程 继承 和多态
Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...
- installshield12如何改变默认安装目录
installshield12如何改变默认安装目录 androidstudio添加其他项目中的module androidrecyclerviewonBindViewHolder [RealSense ...
- Web.config中设置启用webservice远程调试訪问
在.NET 中已经默认将webservice的远程调试功能关闭.有的时候我们须要远程调试程序的时候,就须要打开此功能我们仅仅需在webservice的项目的中添web.config的<syste ...
- jQuery name选择器 带正则 写法示例
$("div[id]") 选择所有含有id属性的div元素 $("input[name='target']") 选择所有的name属性等于'target'的in ...
- 几种通讯协议的比较RMI > Httpinvoker >= Hessian >> Burlap >> web service (转)
一.综述 本文比较了RMI,Hessian,Burlap,Httpinvoker,web service等5种通讯协议的在不同的数据结构和不同数据量时的传输性能.RMI是java语言本身提供的通讯协议 ...