JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Software Design  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
話題被移動
該話題已被移動 - browser , 2005-05-12 00:40
如果您尚不清楚該話題被移動的原因,請參考論壇規則以及本版公告或者聯系本版版主。
本主題所含的標籤
無標籤
作者 有關simple Factory的問題
ericwang1017





發文: 20
積分: 0
於 2005-05-11 23:43 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
小弟是剛學習DP的新手,在這裡有個問題想請教版上的大大

在simpleFactory中,是否可以做到動態至換class的效果

以下為程式碼(抱歉各位版大,一些interface就不寫了)

1
2
3
4
main:{
//取得一個為MSSQL類別的物件
    public DBCalss db  =  DBFactory("MSSQL")
}


而在DBfactory這個類中,用Switch來return Class已達到動態產生class的效果
1
2
3
4
5
6
7
8
DBFactory(string whatkindDbcalss){
switch (whatkindDbcalss)
    case "MSSQL"
           return New MSSQL
    case "Access"
           return New Access
 
}


這樣我就可以依照傳入的值(傳入MSSQL得MSSQL的class,傳入Access字串得Access的Class),來取得不同的Calss

問題來了...............
今天我有一個新的Calss叫 Oracle
照理來說我應該在DBFactory那邊加入一個新的程式碼,如switch裡面多了以下的程式碼
1
2
    Case "Oracle" 
         Return New Oracle

然後在傳入字串的地方傳入Oracle,然後我的 db物件 就會變成了Oracle的class了

那現在 有沒有辦法不加入以上那一段程式,我一樣可以取得oracle物件呢?

============
其實我是想寫個Db操作的程式,然後藉由讀取config檔來得知我要取什麼DB

但是我又想要有擴充性
若未來有多一個Oracle的class
我只要把這個class放到編譯器目錄下面,然後換掉Config檔裡的字串,我的程式就變成了可以操作Oracle的程式了

不知大大有什麼方法或是哪種pattern可以提供小弟參考的


ericwang1017 edited on 2005-05-12 00:26
reply to postreply to post
作者 Re:有關simple Factory的問題 [Re:ericwang1017]
Shen





發文: 167
積分: 3
於 2005-05-12 01:16 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
ericwang1017 wrote:
問題來了...............
今天我有一個新的Calss叫 Oracle
照理來說我應該在DBFactory那邊加入一個新的程式碼,如switch裡面多了以下的程式碼
1
2
    Case "Oracle" 
         Return New Oracle

然後在傳入字串的地方傳入Oracle,然後我的 db物件 就會變成了Oracle的class了

那現在 有沒有辦法不加入以上那一段程式,我一樣可以取得oracle物件呢?


改寫成Class.forName()的方式去動態載入Class,然後再newInstance()即可!~


reply to postreply to post
作者 Re:有關simple Factory的問題 [Re:ericwang1017]
ericwang1017





發文: 20
積分: 0
於 2005-05-12 01:37 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝您的回復,就我所知到的好像也只有這個方法
不過我主要是想瞭解有沒有其他的"寫作技巧"可以達到這樣的功能

假設妳今天遇到的是一個不提供Class.forName()這種功能的語言
(例如是VB.net,還是VB.net也有提供類似的函數嗎?)
那妳要怎樣突破呢?
(除了換成Java以外)

我只是想找個通吃的方法,盡量跟語言無關
但是如果Java與VB.net或是與Delph,C++i都有提供這種功能,那就算了
因為這幾種語言加起來可能佔市場60%以上吧
有沒有見識比較廣的大大知道各個語言他們是否有提供此種函數呢?


reply to postreply to post
作者 Re:有關simple Factory的問題 [Re:ericwang1017]
jd001982





發文: 366
積分: 6
於 2005-05-12 07:40 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
可以用 IoC pattern, 讓別人擔心用的是什麼 DBClass 或這 DBClass 是哪來的. Smile

reply to postreply to post
作者 Re:有關simple Factory的問題 [Re:ericwang1017]
alien

小弟劣作一幅



發文: 772
積分: 6
於 2005-05-12 09:15 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
所謂 IoC 或 DI (dependency injection) 只不過是把 dependency 的 wiring 推至 framework 的一層, 讓真正有 business logic 的 component 不必 couple with 某特定的 implementation, 而讓建立 component 的一層來把 component 的 dependency 建立. 當中用到的技巧, 不外也是用 Reflection (或 reflection-like 的東西), 或 (在沒有 Reflection 的語言或 component framework 下) 得撰寫建立 component 及 wiring 的 logic. DI 與 Simple Factory 能帶來的 decoupling 程度其實沒有什麼大分別, DI 也並不是什麼特別的 pattern 能做到 Simple Factory 做不到的地方 Smile

Simple Factory 其實也是 decouple dependency 的手段, 能用的技巧也差不多. 要是不利用 Reflection (或類似的機制), 當然就得更改其 implementation 了. 但那沒有好處嗎? 當然不是, 重點是, Simple Factory 把原本散落在各地 dependency 集中了, 要更改也就更容易了 Smile 在 C++ 中, 就沒有提供 Reflection 的機制, 但 Factory 當然仍有其存在價值 Smile 真的想做到不用更改 program 就能建立新的 implmentation 也不是不可以. 在 C++, 靠著 DLL/Shared Lib 的 explicit loading 及 symbol lookup, 也可以做到類似 reflection 的效果. 當然, 所花的工夫就得比較大了 Smile


alien edited on 2005-05-12 09:19
reply to postreply to post

public class Alien {
public boolean isNewbie() {
return true;
}
public String toString() {
return "請大家多多指教";
}
}
» JWorld@TW »  Software Design

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8