首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

容易工厂模式(java)

2012-11-03 
简单工厂模式(java)简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类在项目

简单工厂模式(java)

简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类

在项目里使用struts1.x编写Action时都是继承某一个类(如Action),而使用Webwork或者struts2.0时是实现某个接口(如Action),这里采用接口而不使用继承的好处是显而易见的(易于扩张).那采用接口的方式是如何生成Action对象的呢?

这里就使用了工厂方法模式(本人并没有看过webwork,struts的源代码,纯粹是想象).

1.首先定义好接口

interface Action {void execute();}

?

2.编写实现改接口的Action(就是我们项目里要写的Action)

class UserAction implements Action {public void execute() {System.out.println("开始执行UserAction中的东西");}}class RoleAction implements Action {public void execute() {System.out.println("开始执行RoleAction中的东西");}}

?3.定义工厂(生成Action对象的地方)

class ActionFactory {public static Action getAction(String name) {Action action = null;try {action = (Action) Class.forName(name).newInstance();} catch (Exception e) {e.printStackTrace();}return action;}}

name字符窜就是我们配置文件中的class属性?

4.测试代码

public class MethodFactory {public static void main(String[] args) {Action action = ActionFactory.getAction("org.abc.UserAction");action.execute();Action action1 = ActionFactory.getAction("org.abc.RoleAction");action1.execute();}}

?在webwork的配置文件中有method属性就是选择调用Action中的方法(默认是执行execute)

如果想实现该功能增加如下代码

class MethodCall {public static void invoke(String methodName, String className, Object[] obj) {Method[] method = ActionFactory.getAction(className).getClass().getMethods();for (int i = 0; i < method.length; i++) {try {int a = method[i].toString().lastIndexOf(".");String s = method[i].toString().substring(++a, method[i].toString().length()-2);if (s.equals(methodName)) {method[i].invoke(ActionFactory.getAction(className), obj);}} catch (Exception e) {e.printStackTrace();}}}}

?测试用例

public class MethodFactory {public static void main(String[] args) {MethodCall.invoke("execute", "org.abc.UserAction", null);}}


总结

使用条件:一个接口有一系列的实现
如上的Action接口可以有很多实现(UserAction、RoleAction等)
组成元素(以上面例子)
一个接口:Action
许多实现:UserAction、RoleAction
工厂类:ActionFactory

?

热点排行