工厂模式实例(顺便回忆反射机制的应用)

桃浪十七丶
• 阅读 1277

一、原理

反射机制的原理

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

工厂模式自述

所谓工厂模式,是说由某个产品类接口、产品实现类、工厂类、客户端(单元测试主类)构成的一个模式,大程度的降低了代码的耦合性。能够在创建新产品新功能时候,不去触碰原有的逻辑。同时不会对客户端暴露创建逻辑。这篇文章用理发来解释工厂模式的应用。

二 、工厂模式的应用

先写产品接口

public interface Hair {

    /**
     * design hair cutting
     */
    void draw();
}

这部分没有什么好说的 ,和平时的service层一样。创建接口,新建接口方法。 再写产品接口的实现类。 先假设,理发店里有左偏分发型 。

public class LeftHairImpl implements Hair {
    @Override
    public void draw() {
        System.out.println("-----左偏分-----");
    }
}

在实现类里实现了左偏分发型的创建。假如,不使用工厂模式,那么 ,客户端应该是这样的。

public class HairCutTest {
    public static void main(String[]args){
       HairInterface left = new LeftHair();
       left.draw();
    }
}

结果是这样的。工厂模式实例(顺便回忆反射机制的应用) 这样我们在客户端里暴露了我们创建发型的实现逻辑,不利于代码的维护。并且,每次有新的发型,还需要新建Hair,比如我们新建一个右偏分,就要在客户端里新建一个右偏分对象RightHair。

如果,引入了工厂模式

public class HairFactory {
    public HairInterface getHair(String key){
        if("left".equals(key)){
            return new LeftHair();            
        }else if("right".equals(key)){
            return new RightHair();
        }
        return null;
    }
}

那么,客户端应该是这样的。

public class HairCutTest {
    public static void main(String[] args){
        HairFactory factory = new HairFactory();
        HairInterface left =  factory.getHair("left");
        left.draw();
    }
}

运行结果还是一样的。 工厂模式实例(顺便回忆反射机制的应用) 真不错!!!但是安装了 阿里巴巴开发编程规范,一直提醒这魔法值,太难受了奥。而且,每多一种发型,就得写一个else if,头秃!

魔法值:编程规范里提到说是莫名其妙出现的一个值。

改进下,用反射机制写。

public class HairFactory {
    public Hair getHairByClassKey(String className){
        try{
            return (Hair)Class.forName(className).newInstance();
        } catch (IllegalAccessException | InstantiationException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}

这里有简写代码。完整的应该这样:

try {
    Hair hair = (Hair)Class.forName(className).newInstance();
    return hair;
    }

在客户端应该是这样的。

public class HairCutTest {
    public static void main(String[]args){
        HairFactory factory = new HairFactory();
        Hair left = factory.getHairByClassKey("com.factoriespartten.hair.impl.LeftHairImpl");
        left.draw();
    }
}

运行结果是一样的。真香 ! 工厂模式实例(顺便回忆反射机制的应用)

点赞
收藏
评论区
推荐文章
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java中 什么是反射?
JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言(https://www.oschina.net/act
浪人 浪人
3年前
Java基础与提高干货系列——Java反射机制
前言今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来。那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现。正文Java反射机制定义Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以
Wesley13 Wesley13
3年前
java中的反射和代理
  Java反射机制可以动态地获取类的结构,动态地调用对象的方法,是java语言一个动态化的机制。java动态代理可以在不改变被调用对象源码的前提下,在被调用方法前后增加自己的操作,极大地降低了模块之间的耦合性。这些都是java的基础知识,要想成为一名合格的程序猿,必须掌握!Java反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知
Wesley13 Wesley13
3年前
java面试(反射)05
1.什么是反射JAVA反射机制是在运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取类信息以及动态调用对象内容就称为java语言的反射机制。2.反射的作用在运行时判断任意一个对象所属的
lzy lzy
3年前
RPC框架手撕之路---java反射以及动态代理机制
在上一篇文章中,我们提到了,RPC框架所需要的java基础,第一点就是java的动态代理机制,动态代理机制的基础是反射,无论是在实际编程或者是面试时,都是java知识的重中之重。java反射:定义:在运行状态中,对于任意一个类,都能够知道这一个类的所有属性和方法,对于任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息以及动态调用类方法
御弟哥哥 御弟哥哥
3年前
Java基础与提高干货系列 -- Java反射机制
前言今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来。那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现。正文Java反射机制定义Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性
Wesley13 Wesley13
3年前
Java基础之反射(非常重要)
反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码))一、反射的概述JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法
Wesley13 Wesley13
3年前
Java重点基础:反射机制
一、什么是反射?Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。二、反射的三种方式
Wesley13 Wesley13
3年前
Java反射机制及适用场景
什么是Java反射机制?JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为Java的反射机制。反射的适用场景是什么?1.当你做一个软件可以安装插件的功能,你连插件的类型名称都不知道,你怎么实例化这个对象呢