Java学习笔记----工厂模式和反射

来源:互联网 发布:德奥关系 知乎 编辑:程序博客网 时间:2024/06/07 02:26

C#课上老师讲的工厂模式和反射,做了些笔记,课下自己结合JAVA,再复习一次工厂模式还有反射。


工厂模式,顾名思义,工厂是负责生产产品的。我们把代码分成两大块,一块是工厂,一块是客户。


客户发布需求,工厂生产对象,满足客户需求,比如我写个工厂:

<span style="font-size:18px;">class  IFruit{}class apple extends IFruit{  public apple(){  System.out.println("I am Apple");  }}class grape <span style="font-family: Arial, Helvetica, sans-serif;">extends IFruit</span>{  public grape(){  System.out.println("I am grape");  }}class  FruitFactory{ public apple MakeApple(){ return new apple; }  public grape MakeGrape(){ return new grape; }}</span>
客户要用的时候:

先实例化一个FruitFactory


FruitFactory    MyFruitFactory=new FruitFactory();


客户需要哪种水果,工厂就给客户哪种水果(前提是要工长有)
YieldFruit fruit=null;
switch(FruitName){
case "apple":
fruit=MyFruitFactory.MakeApple();
break;
case "grape":
fruit=MyFruitFactory.MakeGrape();
break;


那么问题来了,如果客户又需要一个pear


如果采用原有方法,那么
      既需要在客户代码中的switch中加入判断,又要在工厂方法中加入MakePear方法,
      代码的重用性非常差,耦合度高


因此客户希望不需要switch,我只传递一个想要的水果的名称,就返回该对象


解决途径:

在工厂中只提供一个方法,MakeFruit,然后传递进一个参数Name,代表客户想要的水果的名称,这样的话,似乎客户代码中的那个switch就可以不要了,相反,在FruitFactory中好像需要一个

<span style="font-size:18px;">public class FruitFactory {   </span>
<span style="font-size:18px;">public IFruit MakeFruit(string Name)  <span style="font-family: Arial, Helvetica, sans-serif;">{   </span></span>
<span style="font-size:18px;">       switch (Name)   <span style="font-family: Arial, Helvetica, sans-serif;">{   </span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">              case "Grape":   return new Grape(); </span></span>
<span style="font-size:18px;">    case "Apple":      return new Apple(); </span>
<span style="font-size:18px;">    default:      return null;    }  </span>
<span style="font-size:18px;">    }</span>
<span style="font-size:18px;"> }</span>
<span style="font-size:18px;"></span>
<span style="font-size:18px;">这时候,客户只需要实例化一个FruitFactory对象,然后调动他的MakeFruit方法(把<span style="font-family: Arial, Helvetica, sans-serif;">string Name参数传进去),就能得到相应的水果对象。</span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"></span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">优点:客户代码中不要再写那么一长串的判断代码了。缺点:FruitFactory也有switch啊,所以一旦需求变化,FruitFactory也要变化工厂希望:既然不要条件判断,传入的只有水果的名称,假如Name = “Apple”,要生成一个Apple的对象,我需要new Apple(),如果我能够这样多好: new MakeItToClass(Name),把字符串转换成一个类</span></span>


这时候就要用到反射了


何谓反射?

主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。

             反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。

好,那我们用反射来解决上面提到的问题

class FruitFactory{
    public static fruit getInstance(String ClassName){
        Fruit fruit=null;
        try{
            fruit=(Fruit)Class.forName(ClassName).newInstance();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return fruit;
    }
}
反射机制还有其他一些类

java.lang.Class;                

java.lang.reflect.Constructor; java.lang.reflect.Field;        

java.lang.reflect.Method;

java.lang.reflect.Modifier;

会在后续的文章中运用





0 0