`
13shu
  • 浏览: 72176 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics