利用反射实现简单工厂类,可以任意增加子类
来源:互联网 发布:现代家庭网络布线 编辑:程序博客网 时间:2024/04/29 03:17
1.基础的简单工厂类
//简单工厂设计模式interface Vehicle //写一个接口,但是我更喜欢叫它标准,所有符合这个标准的类均归为同一类{ public void howToWork();}class Car implements Vehicle //汽车类实现交通工具接口(或者说是汽车类符合交通工具标准){ public void howToWork() { System.out.println("开车去!"); }}class Bike implements Vehicle { public void howToWork() { System.out.println("骑车去!"); }}class Airplane implements Vehicle{ public void howToWork() { System.out.println("坐飞机去!"); }}class Factory //工厂类{ public static Vehicle create(String vehicle) //实现一个静态方法用于创建实例 { Vehicle sample = null; switch(vehicle) { case "car": sample = new Car(); break; case "bike": sample = new Bike(); break; case "airplane" : sample = new Airplane(); break; } return sample; }}public class SimpleFactory{ public static void main(String args[]) { Vehicle vehicle = Factory.create(args[0]); vehicle.howToWork(); }}
2.利用反射实现简单工厂类的解耦合
package reflect;//工厂设计模式升级版,简单工厂也可以解决之前难以维护的问题interface Fruit // 定义接口{public void eat();}class Apple implements Fruit{@Overridepublic void eat(){// TODO Auto-generated method stubSystem.out.println("eat Apple");}}class Banana implements Fruit{@Overridepublic void eat(){// TODO Auto-generated method stubSystem.out.println("eat Banana");}}class Orange implements Fruit{@Overridepublic void eat(){// TODO Auto-generated method stubSystem.out.println("eat Orange");}}class Factory{public static Fruit getInstance(String className) throws Exception{Fruit f = null;f = (Fruit) Class.forName(className).newInstance(); //利用反射实现实例化Fruit的子类return f;}}public class TestFactory{public static void main(String[] args) throws Exception{// TODO Auto-generated method stubFruit f = Factory.getInstance("reflect.Orange");f.eat();}}
3.总结:
基础的简单工厂类最大的问题就是新增子类后,修改代码的问题,但是有了反射机制的引入,实现了可以任意增加子类且不会增加代码的维护难度。
4.使用属性配置文件让类的创建更加灵活
还是拿水果来举例子
Fruit.java
package cn.limbo.study;/** * Created by limbo on 2016/10/31. */public interface Fruit { void eat();}Apple.java
package cn.limbo.study;/** * Created by limbo on 2016/10/31. */public class Apple implements Fruit { @Override public void eat() { System.out.println("eat apple"); }}Orange.java
package cn.limbo.study;/** * Created by limbo on 2016/10/31. */public class Orange implements Fruit { @Override public void eat() { System.out.println("Orange"); }}FruitFactory.java
package cn.limbo.study;/** * Created by limbo on 2016/10/31. */public class FruitFactory { public static Fruit getFruit(String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException { Fruit fruit = (Fruit) Class.forName(className).newInstance(); return fruit; }}ReadProperties.java
package cn.limbo.study;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.util.Properties;/** * Created by limbo on 2016/10/31. */public class ReadProperties { public static Properties getProperties() throws IOException { Properties pro = new Properties(); File f = new File("src/fruit.properties"); if(f.exists()) { pro.load(new FileInputStream(f)); }else{ System.out.println("null"); } return pro; }}fruit.properties
apple=cn.limbo.study.Appleorange=cn.limbo.study.Orange
test.java
@Test public void eatFruit() { Properties pro = null; Fruit apple = null; try { pro = ReadProperties.getProperties(); apple = FruitFactory.getFruit(pro.getProperty("apple")); } catch (IOException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } if(apple != null){ apple.eat(); }else{ System.out.println("null"); } }
0 0
- 利用反射实现简单工厂类,可以任意增加子类
- 利用反射机制实现父类转化为子类
- 利用反射实现子类继承父类的值
- 利用反射实现工厂方法
- 利用反射实现工厂模式.
- 反射实现简单工厂模式
- php利用反射优雅的实现工厂
- 利用反射机制实现工厂模式
- 利用java的反射机制得到界面类的所有可以增加的事件列表
- C++利用反射和简单工厂模式实现业务模块解耦
- C++利用反射和简单工厂模式实现业务模块解耦
- C++利用反射和简单工厂模式实现业务模块解耦
- 在C++中利用反射和简单工厂模式实现业务模块解耦
- 简单的用反射实现工厂模式
- 利用反射实现可供任意类使用的toString方法
- 利用java反射实现任意数组copy,reflect.Array
- 利用反射构造工厂
- 反射机制剖析(二): 利用抽象工厂实现BeanFactory
- eclipse中svn的使用
- C#泛型浅谈(浅~)自定义类型数组的排序
- IIrebmuNelgniS.137
- 安卓自动缩放布局,解决屏幕适配问题
- PHP PDO ACCESS 留言板-php转换成HTML页面文件maketohtml.php
- 利用反射实现简单工厂类,可以任意增加子类
- android 跑马灯效果
- 2016华为机试题(java版):两个大数相减的程序(运行成功)
- TextView显示系统时间(秒针变化)
- Android程序的反破解技术
- 欢迎使用CSDN-markdown编辑器
- 修改系统日期的代码。不耗时,很快
- ACM:数论专题(2)——Eular质数筛法
- properties中文乱码,ASCII码