zoukankan      html  css  js  c++  java
  • Java反射研究(3)


    十一、工厂设计模式


    1.最简单的工厂设计模式


    场景:有一个Fruit接口,Apple类和Orange类都实现了Fruit接口,Factory用来生产水果;

    import java.io.*;
    import java.util.*;
    
    interface Fruit{
    	public void eat();
    }
    class Apple implements Fruit{
    	public void eat(){
    		System.out.println("吃苹果");
    	}
    }
    class Orange implements Fruit{
    	public void eat(){
    		System.out.println("吃橘子");
    	}
    }
    class Factory{
    	public static Fruit getInstance(String name)throws Exception{
    		Fruit f = null;
    		if("apple".equals(name)){
    			f = new Apple();
    		}
    		else if("orange".equals(name)){
    			f = new Orange();
    		}
    		if(f!=null){
    			return f;
    		}
    		else return null;
    	}
    }
    public class FactoryDemo01{
    	public static void main(String args[])throws Exception{
    		
    		Fruit f = Factory.getInstance("apple");
    		f.eat();
    	}
    }

    2.通过反射实现


    上面的例子有一个坏处,就是在Factory的getInstance代码会随着水果数量增加而增加,比如如果增加了一个banana类,则需要添加

    if(name.equals("banana")){...}

    这样非常不方便,因此反射就是一个很好的解决方法:

    import java.io.*;
    import java.util.*;
    
    interface Fruit{
    	public void eat();
    }
    class Apple implements Fruit{
    	public void eat(){
    		System.out.println("吃苹果");
    	}
    }
    class Orange implements Fruit{
    	public void eat(){
    		System.out.println("吃橘子");
    	}
    }
    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{
    		
    		Fruit f = Factory.getInstance("Apple");
    		f.eat();
    	}
    }

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


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


    import java.io.*;
    import java.util.*;
    
    interface Fruit{
    	public void eat();
    }
    class Apple implements Fruit{
    	public void eat(){
    		System.out.println("吃苹果");
    	}
    }
    class Orange implements Fruit{
    	public void eat(){
    		System.out.println("吃橘子");
    	}
    }
    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;
    	}
            private Factory(){}
    }
    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
    orange=Orange



    作者:xiazdong
    出处:http://blog.xiazdong.info
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    误加all_load引起的程序报错
    ConstraintLayout 约束布局
    前端判断是否APP客户端打开触屏,实现跳转APP原生组件交互之遐想
    TP5 多条件whereOr查询
    json手动解析详解
    Centos python 2.6 升级到 2.7
    js中click重复执行
    使用 Python 实现实用小工具
    使用 Python 编写密码爆破工具
    使用Python进行无线网络攻击
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3058123.html
Copyright © 2011-2022 走看看