用于管理活動資源的通用模式
1.不用管理模式
1 public class BalanceChecker {
2 private BankAccountManager mgr;
3
4 public BalanceChecker() {
5 mgr = new BankAccountManager();
6 }
7
8 public boolean hasEnoughMoney(int bankAccountId, double money) {
9 BankAccount account = mgr.getBankAccount(bankAccountId);
10 return account.getBalance() >= money);
11 }
12 }
2 private BankAccountManager mgr;
3
4 public BalanceChecker() {
5 mgr = new BankAccountManager();
6 }
7
8 public boolean hasEnoughMoney(int bankAccountId, double money) {
9 BankAccount account = mgr.getBankAccount(bankAccountId);
10 return account.getBalance() >= money);
11 }
12 }
實際上只需要一個BankAccountManager,它可以被多個對象和線程重用。可以用靜態方法代替:
1 public boolean hasEnoughMoney(int bankAccountId, double money) {
2 BankAccount account = BankAccountManager.getBankAccount(bankAccountId);
3 return account.getBalance() >= money;
4 }
2 BankAccount account = BankAccountManager.getBankAccount(bankAccountId);
3 return account.getBalance() >= money;
4 }
但是這樣與BankAccountManager緊密耦合在一起。
2.單例模式(Singleton pattern)
簡單例子:
1 public class Widget {
2 private static Widget instance = new Widget();
3
4 public static Widget getInstance() {
5 return instance;
6 }
7 private Widget() {
8 }
9 public int doSomething(int x, int y) {
10 return x + y;
11 }
12 }
2 private static Widget instance = new Widget();
3
4 public static Widget getInstance() {
5 return instance;
6 }
7 private Widget() {
8 }
9 public int doSomething(int x, int y) {
10 return x + y;
11 }
12 }
重構后的:
1 public class BalanceChecker {
2 private BankAccountManager mgr;
3 public BalanceChecker() {
4 mgr = BankAccountManager.getInstance();
5 }
6 public boolean hasEnoughMoney(int bankAccountId, double money) {
7 BankAccount account = mgr.getBankAccount(bankAccountId);
8 return account.getBalance() >= money);
9 }
10 }
2 private BankAccountManager mgr;
3 public BalanceChecker() {
4 mgr = BankAccountManager.getInstance();
5 }
6 public boolean hasEnoughMoney(int bankAccountId, double money) {
7 BankAccount account = mgr.getBankAccount(bankAccountId);
8 return account.getBalance() >= money);
9 }
10 }
如果需要不同類型的BankAccountManager呢?則不行。仍是緊耦合。
3.工廠模式(Factory pattern)
1 public class BalanceChecker {
2 private BankAccountManager mgr;
3 public BalanceChecker() {
4 mgr = BankAccountManagerFactory.getManager();
5 }
6 public boolean hasEnoughMoney(int bankAccountId, double money) {
7 BankAccount account = mgr.getBankAccount(bankAccountId);
8 return account.getBalance() >= money);
9 }
10 }
getManager()返回BankAccountManager接口的一個實現。2 private BankAccountManager mgr;
3 public BalanceChecker() {
4 mgr = BankAccountManagerFactory.getManager();
5 }
6 public boolean hasEnoughMoney(int bankAccountId, double money) {
7 BankAccount account = mgr.getBankAccount(bankAccountId);
8 return account.getBalance() >= money);
9 }
10 }
3.注冊類模式(Registry pattern)
工廠類對解耦代碼非常有效,當是當有許多工廠類,處理所有不同的工廠類將難以控制。
此時,可以創建一個稱為registry的類,把它作為組件倉庫,用來存放所有將要選用的組件。
一個注冊類最簡單的形式僅僅是鍵到對象的映射。WebWork的ActionContext就是一個注冊類的例子
posted on 2007-11-05 13:39 vinny 閱讀(198) 評論(0) 編輯 收藏 所屬分類: Java