您的位置:首页 > 编程语言 > Java开发

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

2016-04-06 19:52 447 查看
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中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。

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

java.lang.Class;                

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

java.lang.reflect.Method;

java.lang.reflect.Modifier;
会在后续的文章中运用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 工厂模式