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

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 Fruit Factory{
     public  static  fruit getInstance(String ClassName){
        F ruit 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值