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

一、原理

反射机制的原理

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

工厂模式自述

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

二 、工厂模式的应用

先写产品接口

1public interface Hair { 2 3 /** 4 * design hair cutting 5 */ 6 void draw(); 7}

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

1public class LeftHairImpl implements Hair { 2 @Override 3 public void draw() { 4 System.out.println("-----左偏分-----"); 5 } 6}

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

1public class HairCutTest { 2 public static void main(String[]args){ 3 HairInterface left = new LeftHair(); 4 left.draw(); 5 } 6}

结果是这样的。在这里插入图片描述 这样我们在客户端里暴露了我们创建发型的实现逻辑,不利于代码的维护。并且,每次有新的发型,还需要新建Hair,比如我们新建一个右偏分,就要在客户端里新建一个右偏分对象RightHair。

如果,引入了工厂模式

1public class HairFactory { 2 public HairInterface getHair(String key){ 3 if("left".equals(key)){ 4 return new LeftHair(); 5 }else if("right".equals(key)){ 6 return new RightHair(); 7 } 8 return null; 9 } 10}

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

1public class HairCutTest { 2 public static void main(String[] args){ 3 HairFactory factory = new HairFactory(); 4 HairInterface left = factory.getHair("left"); 5 left.draw(); 6 } 7}

运行结果还是一样的。 在这里插入图片描述 真不错!!!但是安装了 阿里巴巴开发编程规范,一直提醒这魔法值,太难受了奥。而且,每多一种发型,就得写一个else if,头秃!

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

改进下,用反射机制写。

1public class HairFactory { 2 public Hair getHairByClassKey(String className){ 3 try{ 4 return (Hair)Class.forName(className).newInstance(); 5 } catch (IllegalAccessException | InstantiationException | ClassNotFoundException e) { 6 e.printStackTrace(); 7 } 8 return null; 9 } 10}

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

1try { 2 Hair hair = (Hair)Class.forName(className).newInstance(); 3 return hair; 4 }

在客户端应该是这样的。

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

运行结果是一样的。真香 ! 在这里插入图片描述

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java中 什么是反射?

JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言(https://www.oschina.net/act

java中的反射和代理

  Java反射机制可以动态地获取类的结构,动态地调用对象的方法,是java语言一个动态化的机制。java动态代理可以在不改变被调用对象源码的前提下,在被调用方法前后增加自己的操作,极大地降低了模块之间的耦合性。这些都是java的基础知识,要想成为一名合格的程序猿,必须掌握!Java反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知

java面试(反射)05

1.什么是反射JAVA反射机制是在运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取类信息以及动态调用对象内容就称为java语言的反射机制。2.反射的作用在运行时判断任意一个对象所属的

Java基础与提高干货系列——Java反射机制

前言今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来。那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现。正文Java反射机制定义Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以

RPC框架手撕之路---java反射以及动态代理机制

在上一篇文章中,我们提到了,RPC框架所需要的java基础,第一点就是java的动态代理机制,动态代理机制的基础是反射,无论是在实际编程或者是面试时,都是java知识的重中之重。java反射:定义:在运行状态中,对于任意一个类,都能够知道这一个类的所有属性和方法,对于任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息以及动态调用类方法