一个新的获取对象实例的方法
工厂模式提供方法来创建对象,但是在factory中看到那一堆if/else就比较头痛,心想是不是
可以让相关的对象统一继承一个接口,将key 值和对象放在一个map里面,取对象是直接从
map里面取呢?
1. 首先建立一个action类
package com.fp.app;
import java.util.HashMap;
public class Action {
private final HashMap<String, BookDetailAction> myIdToActionMap = new HashMap<String, BookDetailAction>();
protected final void addAction(String actionId, BookDetailAction action) {
myIdToActionMap.put(actionId, action);
}
private final BookDetailAction getAction(String actionId) {
return (BookDetailAction) myIdToActionMap.get(actionId);
}
public final boolean doAction(String actionId) {
BookDetailAction action = getAction(actionId);
if (action != null) {
return action.run();
} else
return false;
}
}
从代码中看到map用来存储key和BookDetailAction的实现类
在doaction取出实现类,执行run方法
2. ComposeBookDetailAction 为client给外部调用的入口
package com.fp.app;
abstract class BookDetailAction {
protected ComposeBookDetailAction bookdetailAction;
public BookDetailAction() {
super();
}
BookDetailAction(ComposeBookDetailAction BookdetailAction) {
bookdetailAction = BookdetailAction;
}
abstract protected boolean run();
}
3.
package com.fp.app;
import com.fp.app.model.GetContentInfoContentInfo;
import com.fp.app.model.SubscribeInfo;
public final class ComposeBookDetailAction extends Action {
private GetContentInfoContentInfo contentinfo;
private SubscribeInfo subscribeinfo;
public GetContentInfoContentInfo getContentinfo() {
return contentinfo;
}
public void setContentinfo(GetContentInfoContentInfo contentinfo) {
this.contentinfo = contentinfo;
}
public SubscribeInfo getSubscribeinfo() {
return subscribeinfo;
}
public void setSubscribeinfo(SubscribeInfo subscribeinfo) {
this.subscribeinfo = subscribeinfo;
}
public ComposeBookDetailAction(GetContentInfoContentInfo contentinfo, SubscribeInfo subscribeinfo) {
super();
this.contentinfo = contentinfo;
this.subscribeinfo = subscribeinfo;
addAction(BookDetailActionCode.ADD_BOOKMARK, new AddBookmarkAction(this));
addAction(BookDetailActionCode.DEL_BOOKMARK, new DelBookmarkAction(this));
}
}
4.二个 BookDetailAction的实现类
package com.fp.app;
import com.fp.app.model.GetContentInfoContentInfo;
import com.fp.app.model.SubscribeInfo;
public class AddBookmarkAction extends BookDetailAction {
AddBookmarkAction(ComposeBookDetailAction BookdetailAction) {
super(BookdetailAction);
}
@Override
protected boolean run() {
GetContentInfoContentInfo contentinfo = bookdetailAction.getContentinfo();
System.out.println("add bookmark action"+contentinfo.getContentID());
SubscribeInfo subscribeinfo = bookdetailAction.getSubscribeinfo();
System.out.println("add bookmark action"+subscribeinfo.getFeeDescription());
return false;
}
}
package com.fp.app;
public class DelBookmarkAction extends BookDetailAction {
DelBookmarkAction(ComposeBookDetailAction BookdetailAction) {
super(BookdetailAction);
}
@Override
protected boolean run() {
System.out.println("del bookmark action");
return false;
}
}
5.client调用代码
package com.fp.app;
import com.fp.app.model.GetContentInfoContentInfo;
import com.fp.app.model.SubscribeInfo;
public class Test {
private static ComposeBookDetailAction BookdetailAction;
/**
* @param args
*/
public static void main(String[] args) {
if (BookdetailAction == null) {
GetContentInfoContentInfo contentinfo =new GetContentInfoContentInfo();
contentinfo.setContentID("123456");
SubscribeInfo subscribeinfo = new SubscribeInfo();
subscribeinfo.setFeeDescription("我们都是好人");
BookdetailAction = new ComposeBookDetailAction(contentinfo,subscribeinfo);
BookdetailAction.doAction(BookDetailActionCode.ADD_BOOKMARK);
}
}
}
浙公网安备 33010602011771号