一个新的获取对象实例的方法
工厂模式提供方法来创建对象,但是在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); } } }