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

» JWorld@TW » Software Design » Effective Java  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
話題被移動
該話題已被移動 - morchory , 2003-10-03 01:40
如果您尚不清楚該話題被移動的原因,請參考論壇規則以及本版公告或者聯系本版版主。
本主題所含的標籤
無標籤
作者 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 [Re:wctang]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2003-10-02 17:43 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
wctang wrote:
如果用 reflection 來做的話,就可以更增動態性了…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
abstract class TestInterface {
    public static TestInterface getRealObject(String subclass) {
        try {
            Class sub = Class.forName(subclass);
            return (TestInterface)sub.newInstance();
        } catch ( Exception e) {
            return null;
        }
    }
    public abstract void show();
}
 
class TestSub1 extends TestInterface {
    public void show() {
        System.out.println("TestSub1");
    }
}
 
class TestSub2 extends TestInterface {
    public void show() {
        System.out.println("TestSub2");
    }
}
 
public class TestMain {
    public static void main( String[] args) {
        TestInterface.getRealObject("TestSub2").show();
        TestInterface.getRealObject("TestSub1").show();
    }
}



我覺得這樣子寫並沒有帶來太多好處,以某個角度看反而比 factory method 更是不好的作法。

因為這樣子的作法還是得指名道姓,這跟直接以 public constructor 一樣都是把類別名稱寫出來,你的作法彈性更小只能應付有 default constructor 的型別。而兩者同樣的缺點是,你會自然而然地讓建構物件的程式片段分散在各處,假如目前偕同作用的物件是一組的,當遇到需要替換成另一組時,你得翻遍所有的程式碼找出建構物件的部分,這就是為什麼要用 Abstract Factory,至少 Abstract Factory 可以縮小物件生產的範圍(集中在 factory 身上)抽換 factory 就可以整個換掉。

當然你也可以試著讓 TestInterface- getReadObject(static factory method)使用的地方侷限在某個範圍,但這樣子你的作法顯得沒有很必要,但的確是可以讓他的生產種類提到最大,不過就像 iampoya 提到的,有少了 compile-time type checking 的弊病。

我想 static factory method 本身就有一個缺點是不能避免的,那就是不容易擴充。一個 static factory method 會產出的物件決定了,似乎沒辦法在不修改程式碼的情況下得到另外不同 subclass 的 instance(如果不搭配其他的 pattern),你沒有辦法透過繼承機制來改變或擴充 static factory method 的產品(種類)。


reply to postreply to post

給我
辣味豆腐 其餘免談
話題樹型展開
人氣 標題 作者 字數 發文時間
24888 [精華] [Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 metavige 1085 2003-10-01 14:51
22115 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 ymshin 106 2003-10-01 15:46
22194 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 metavige 553 2003-10-01 16:03
20771 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 davidlovesmoly 1120 2004-04-23 12:03
20767 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 metavige 1301 2004-04-23 14:37
20642 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 davidlovesmoly 260 2004-04-23 17:59
21184 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 davidlovesmoly 136 2004-04-23 18:05
15544 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 gongtow 782 2005-11-01 00:13
21918 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 ymshin 77 2003-10-01 16:26
22474 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 ingramchen 1532 2003-10-01 18:48
21985 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 metavige 273 2003-10-01 22:34
22335 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 Duncan 441 2003-10-01 22:10
21850 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 ymshin 81 2003-10-01 22:47
21897 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 wctang 815 2003-10-02 13:38
21883 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 iampoya 129 2003-10-02 14:57
21896 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 wctang 472 2003-10-02 16:08
21827 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 iampoya 461 2003-10-02 16:49
21893 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 Duncan 1539 2003-10-02 17:43
21910 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 wctang 1114 2003-10-02 18:12
21920 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 wctang 1607 2003-10-02 17:53
21904 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 Duncan 624 2003-10-02 18:08
21905 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 wctang 517 2003-10-02 18:21
21783 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 tempo 512 2003-10-03 09:35
21867 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 metavige 492 2003-10-02 20:42
21686 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 etman 466 2003-10-29 10:33
20600 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 LarryBank 27 2004-04-19 17:08
20567 Re:[Effective Java] 條款1 : 考慮以 "static factory methods" 取代建構式 metavige 150 2004-04-23 14:24
» JWorld@TW »  Software Design » Effective Java

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

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8