黑马程序员_学习笔记2交通灯系统中面向对象思想的理解以及工厂模式的应用

来源:互联网 发布:java中强制类型转换 编辑:程序博客网 时间:2024/06/07 14:26
 

---------------------- android培训、java培训、期待与您交流! ----------------------

        

         “两个石头磨成一个石刀,石刀砍树,树被做成椅子。

          这三个小句子中对我来说最麻烦的是第二个,石刀砍树。 Material   m  = stoneKnife.cut(tree).第二格句子一共用到了3个对象,stoneKnife是个对象,tree是个对象,返回值是一个material对象。单从语句中,我们并不能找出对应于material的对象,这里需要程序员根据语义增加合适的类。那第3句其实就被改成了,“材料被做成椅子”。

          第一个句子张老师的实现是 StoneKnife stoneKnife= stoneKnifeFactory.create(Stonestone1,Stone stone2)。张老师在这个句子的实现中多增加了一个中间层,stoneKnifeFactory。我有些疑问。这个中间类的作用不就是构造器的作用吗?用一个构造方法是不是更好呢?StoneKnife(Stone s1,Stone s2)。这样可以省略了一个类。是不是更符合题意呢?

         张老师对这个面试题的解答,对我最大的帮助就是开阔了我的思路。虽然题中有些对象并没有出现,但是作为程序员的我们却拥有增加对象(类)的权利。

        视频中对枚举的使用,让我更深刻的理解了枚举。枚举类其实就是拥有确定数量静态实例,且继承自enum的普通类。枚举类型的实例对象定义于类的最开始部分。

enum Colors(){

          RED(构造参数,构造参数s),GREEN(构造参数,构造参数s),YELLOW(构造参数,构造参数s);//实例对象后的括号内是枚举类的私有构造方法的构造参数。可以把这

个位置理解为隐式的执行了ColorsRED= new   Colors(),这个区域应该算是一个特殊枚举类的区域,这里的实例拥有这个枚举的所有非构造方法。enum自身的方法以及一个由编译器增加的value方法。value方法并不是enum中的方法,而是编译器增加的,来源比较特别

         private Colors (构造参数,构造参数){//构造方法必须私有。

        }

        (私有的?)成员变量和(任意的?)成员方法

}

     对枚举类的使用如下:

     Colors  cl = Colors.RED;

     cl.成员方法。

     今天的视频让我有些感触,一定要静下心来认真写程序,需求分析很重要的。如果没有弄清楚要做些什么就盲目乐观,或盲目悲观,都无助于程序的完成。完成程序之前,喜或悲都无意义。

      做程序,只需要认真。

  1,最简单的工厂类实现模式

       class Factory{  

  •     public static Fruit getInstance(String name)throws Exception{  //在Factory的getInstance代码会随着水果数量增加而增加,比如如果增加了一个banana类,则需要添加if(name.equals("banana")){...}
  •         Fruit f = null;  
  •         if(name.equals("apple")){  
  •             f = new Apple();  
  •         }  
  •         else if(name.equals("orange")){  
  •             f = new Orange();  
  •         }  
  •         if(f!=null){  
  •             return f;  
  •         }  
  •         else return null;  
  •     }  
  • }  

        

    2,通过反射实现这个类

    class Factory{  

  •     public static Fruit getInstance(String name)throws Exception{  
  •         Fruit f = null  
  •         Fruit f = (Fruit)Class.forName(name).newInstance();  
  •         if(f!=null){  
  •             return f;  
  •         }  
  •         else return null;  
  •     }  
  • }  

    3.增加灵活性:配置文件


    但是还有一个缺点,就是如果Apple类等有包名,则如果要访问此类,必须添加包名+类名称才可以。比如Apple类的最上方:package org;则必须通过org.Apple才可以访问Apple类。因此通过Properties文件可以解决这个问题;

     

    class Factory{  

  •     public static Fruit getInstance(String name)throws Exception{  
  •         Fruit f = null  
  •         Fruit f = (Fruit)Class.forName(name).newInstance();  
  •         if(f!=null){  
  •             return f;  
  •         }  
  •         else return null;  
  •     }  

    public class FactoryDemo01{  

  •     public static void main(String args[])throws Exception{  
  •         Properties p = new Properties();  
  •         p.load(new FileInputStream("1.properties"));  
  •         String str = p.getProperty("apple");  
  •         Fruit f = Factory.getInstance(str);  
  •         f.eat();  
  •     }  
  • }  
    1.properties内容
    apple=Apple
    这个程序较完整的展示了一些类的用法,而且思路非常清晰。我觉得非常难得。因此拿来作为日后程序的模板。

     

    ---------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima