简单工厂模式(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
?