針對反覆出現的問題,經驗證有效的解決策略。獨立於程式語言,解決常見 OO 設計問題。掌握模式術語可高效溝通,你可能已在無意識使用,只是缺乏標準名稱。
提供比工廠方法更高層介面,常用於返回多個工廠中的某一個。
interface Local {
DataInfo[] loadDB(String filename);
}
interface Remote extends Local {
void connect2WWW(String url);
}
class LocalMode implements Local {
public DataInfo[] loadDB(String name) {
System.out.print("Load from local database");
return null;
}
}
class RemoteMode implements Remote {
public void connect2WWW(String url) {
System.out.println("Connect to remote site");
}
public DataInfo[] loadDB(String name) {
System.out.println("Load from remote database");
return null;
}
}
interface ConnectionFactory {
Local getLocalConnection();
Remote getRemoteConnection();
}
class DataManager implements ConnectionFactory {
private boolean local = false;
public Local getLocalConnection() { return new LocalMode(); }
public Remote getRemoteConnection() { return new RemoteMode(); }
public void loadData() {
if (local) {
Local conn = getLocalConnection();
data = conn.loadDB("db.db");
} else {
Remote conn = getRemoteConnection();
conn.connect2WWW("www.some.where.com");
data = conn.loadDB("db.db");
}
}
public void setConnection(boolean b) { local = b; }
}
class Test {
public static void main(String[] args) {
DataManager dm = new DataManager();
if (args.length == 1) { // 參數存在 → 本地模式
dm.setConnection(true);
dm.getLocalConnection().loadDB("db.db");
} else { // 無參數 → 遠端模式
dm.getRemoteConnection().connect2WWW("www.javacamp.org/db/");
dm.getRemoteConnection().loadDB("db.db");
}
// 後續統一處理 data,無需關心連接細節
}
}
C:\> java Test Connect to remote site Load from remote database C:\> java Test local Load from local database
新增資料來源(如雲端)僅需:在 ConnectionFactory 加入方法、對應位置實現、無需修改既有程式結構。這正是 Sun 認證考試常考的設計精髓。