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

Java中工厂、配置文件和反射学习

2016-09-12 14:37 405 查看
学习程序的最好方式就是编代码实现它,这里我们假设一个场景为要开一个晚会,晚会的流程为:1.晚会开始;2.唱歌;3.舞蹈;4.小品;5结束。


一、传统方法

1、新建Java项目:party

2、在party项目中新建类EveningParty

[java] view
plain copy

 





package com.gmail.lsgjzhuwei;  

  

public class EveningParty {  

    public static void main(String[] args)  

    {  

          

    }  

}  

在EveningParty类中实现晚会的流程,新建process函数,在process函数中实现整个晚会流程,具体代码为:

[java] view
plain copy

 





public void process()  

    {  

        //1.晚会开始  

        //2.唱歌  

        //3.舞蹈  

        //4.小品  

        //5.晚会结束  

        System.out.println("晚会开始");  

          

        //唱歌  

        Singable singable = new Liudehua();  

        singable.sing();  

          

        //跳舞  

        Dancleable dancleable = new Xiaohudui();  

        dancleable.dance();  

          

        //小品  

        Essayable essayable = new Zhaobenshan();  

        essayable.essay();  

          

        }  

这里出现了三个类sIngable、Dancleable、和Essayable,为新建的接口,为了程序扩展方面,需要建立三个接口sIngable、Dancleable、和Essayable,分别用于实现唱歌跳舞和小品,具体的代码为:

[java] view
plain copy

 





package com.gmail.lsgjzhuwei;  

  

/** 

 * @author Leo Chu 

 *Singable接口用于实现唱歌 

 * 2014-8-24 

 */  

public interface Singable {  

    public void sing();  

}  

[java] view
plain copy

 





package com.gmail.lsgjzhuwei;  

  

/** 

 * @author Leo Chu 

 *Dancleable接口用于实现跳舞 

 * 2014-8-24 

 */  

public interface Dancleable {  

    public void dance();  

}  

[java] view
plain copy

 





package com.gmail.lsgjzhuwei;  

  

/** 

 * @author Leo Chu 

 *Essayable接口用于实现小品 

 * 2014-8-24 

 */  

public interface Essayable {  

    public void essay();  

}  

3.分别定义歌手、舞者和小品表演者分别实现上述接口

3.1定义Liudehua类实现Singable接口

[java] view
plain copy

 





package com.gmail.lsgjzhuwei;  

  

public class Liudehua implements Singable {  

  

  

    public void sing() {  

        // TODO Auto-generated method stub  

        System.out.println("刘德华演唱中国人");  

    }  

  

}  

3.2定义Naying实现Sinable接口

[java] view
plain copy

 





package com.gmail.lsgjzhuwei;  

  

public class Naying implements Singable  

{  

    public void sing()  

    {  

        System.out.println("那英演唱:雾里看花");  

    }  

}  

3.3定义Xiaohudui实现Dancleable接口

[java] view
plain copy

 





package com.gmail.lsgjzhuwei;  

  

public class Xiaohudui implements Dancleable {  

  

      

    public void dance() {  

        // TODO Auto-generated method stub  

        System.out.println("小虎队舞蹈:爱");  

    }  

  

}  

3.4定义Chenailian实现Dancleable接口

[java] view
plain copy

 





package com.gmail.lsgjzhuwei;  

  

public class Chenailian implements Dancleable {  

  

    public void dance() {  

        // TODO Auto-generated method stub  

        System.out.println("陈爱莲舞蹈:天鹅舞");  

    }  

  

}  

3.5定义Zhaobenshan实现Essayable接口

[java] view
plain copy

 





package com.gmail.lsgjzhuwei;  

  

public class Zhaobenshan implements Essayable {  

  

    public void essay() {  

        // TODO Auto-generated method stub  

        System.out.println("赵本山小品:卖乖");  

    }  

  

}  

3.6定义Liuqian实现Essayable接口

[java] view
plain copy

 





package com.gmail.lsgjzhuwei;  

  

public class Liuqian implements Essayable {  

  

    public void essay() {  

        // TODO Auto-generated method stub  

        System.out.println("刘谦魔术:水中捞月");  

    }  

  

}  

4.修改主函数中代码

[html] view
plain copy

 





package com.gmail.lsgjzhuwei;  

  

public class EveningParty {  

    public static void main(String[] args)  

    {  

        new EveningParty().process();  

    }  

      

    public void process()  

    {  

        //1.晚会开始  

        //2.唱歌  

        //3.舞蹈  

        //4.小品  

        //5.晚会结束  

        System.out.println("晚会开始");  

          

        //唱歌  

        Singable singable = new Liudehua();  

    singable.sing();  

          

        //跳舞  

        Dancleable dancleable = new Xiaohudui();  

        dancleable.dance();  

          

        //小品  

//      Essayable essayable = new Zhaobenshan();  

        essayable.essay();  

                      

        System.out.println("晚会结束");  

  

    }  

  

}  

OK,程序可以正常运行。

但是程序这么写的话会出现一个问题:每次更好演员的时候需要修改晚会类的代码,这就给程序的扩展和维护带来了不便。那应该怎么做呢?可不可以吧这些麻烦的修改部分外包给一个代理去做,由代理类完成演员的修改,这就是我们下面要介绍的一种方法:用Factory类做代理负责代码的修改。


二/利用factory类,把需要变化的部分放到factory类中

1.在上面程序的基础上新建Factory类,

[html] view
plain copy

 





package com.gmail.lsgjzhuwei;  

  

import java.util.ResourceBundle;  

  

public class Factory {  

    public  Singable getSingable()  

    {  

        return new Liudehua();  

    }  

      

    public  Dancleable getDancleable()   

    {  

        return new Xiaohudui();  

    }  

      

    public static Essayable getEssayable()  

    {  

        return new Zhaobenshan();  

    }  

}  

2.修改晚会类代码

[java] view
plain copy

 





package com.gmail.lsgjzhuwei;  

  

public class EveningParty {  

    public static void main(String[] args)  

    {  

        new EveningParty().process();  

    }  

      

    public void process()  

    {  

        //1.晚会开始  

        //2.唱歌  

        //3.舞蹈  

        //4.小品  

        //5.晚会结束  

        System.out.println("晚会开始");  

          

//      //唱歌  

//      Singable singable = new Liudehua();  

//      singable.sing();  

//        

//      //跳舞  

//      Dancleable dancleable = new Xiaohudui();  

//      dancleable.dance();  

//        

//      //小品  

//      Essayable essayable = new Zhaobenshan();  

//      essayable.essay();  

          

        Factory factory = new Factory();  

        factory.getSingable().sing();  

        factory.getDancleable().dance();  

        factory.getEssayable().essay();  

          

          

          

        System.out.println("晚会结束");  

  

    }  

  

}  

OK,也是可以运行的

用这种方法不用修改晚会类,但是还是要修改代码,还有一种方法就是将演员的实例类写入配置文件


三、映射方法

1.在上面代码的基础上,在src目录下新建party.properties类,将演员的实例类写入配置文件,代码为:

[java] view
plain copy

 





Singable = com.gmail.lsgjzhuwei.Liudehua  

Dancleable = com.gmail.lsgjzhuwei.Xiaohudui  

Essayable = com.gmail.lsgjzhuwei.Zhaobenshan  

2.修改Factory类中调用演员类的代码:

[java] view
plain copy

 





package com.gmail.lsgjzhuwei;  

  

import java.util.ResourceBundle;  

  

public class Factory {  

    public static Singable getSingable()  

    {  

        String className = ResourceBundle.getBundle("party").getString("Singable");  

        try {  

            Object obj = Class.forName(className).newInstance();  

            return (Singable) obj;  

        }  catch (Exception e) {  

            // TODO Auto-generated catch block  

            e.printStackTrace();  

            throw new RuntimeException("对象不正确");  

        }     

    }  

      

    public static  Dancleable getDancleable()   

    {  

        String className = ResourceBundle.getBundle("party").getString("Dancleable");  

        try {  

            Object obj = Class.forName(className).newInstance();  

            return (Dancleable) obj;  

        } catch (Exception e) {  

            // TODO Auto-generated catch block  

            e.printStackTrace();  

            throw new RuntimeException("对象不正确");  

        }  

          

    }  

      

    public static Essayable getEssayable()  

    {  

        String className = ResourceBundle.getBundle("party").getString("Essayable");  

        try {  

            Object obj = Class.forName(className).newInstance();  

            return (Essayable) obj;  

        } catch (Exception e) {  

            // TODO Auto-generated catch block  

            e.printStackTrace();  

            throw new RuntimeException("对象不正确");  

        }  

    }  

}  

3.不用修改晚会类代码,执行程序,OK正确。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 反射 工厂