2010-05-25 143 views
3

我知道,我們在編程中所做的一切,可謂設計模式(即使是抽象的方法稱爲模板方法設計模式)這是什麼設計模式?


public class Guicer extends AbstractModule { 
    private static Injector injector = Guice.createInjector(new Guicer()); 

    public static void setInjector(Injector injector) { 
     Guicer.injector = injector; 
    } 

    public static <T> T getInstance(Class<T> c) { 
     return injector.getInstance(c); 
    } 

    @Override 
    protected void configure() { 

    } 
} 

在這段代碼中使用什麼設計模式?編號喜歡叫那個類GuiceStateHolder,但我不知道它。

+12

「我們在編程中所做的一切都可以被描述爲設計模式」一個常見的錯誤 – Andrey 2010-05-25 11:22:49

+6

設計模式可以幫助您構建事物。不要擔心他們太嚴格,否則他們會開始阻礙你。 – samoz 2010-05-25 11:23:07

+1

「我們在編程中做的所有事情都可以用設計模式來描述」,但其中一些模式有「意大利麪條代碼」等名稱,實際上是反模式 – 2010-05-25 11:27:23

回答

1

好吧,我會打電話給此位:

private static Injector injector = Guice.createInjector(new Guicer()); 

public static void setInjector(Injector injector) { 
    Guicer.injector = injector; 
} 

只寫全局變量。

在這裏:

public static <T> T getInstance(Class<T> c) { 
    return injector.getInstance(c); 
} 

您更換一個全局函數實例方法。所以你基本上有一個全局變量,任何人都可以寫,但你只能調用它的一個方法。由於噴油器的界面更多,它可能是某種受限制的外觀。

但是它們比模式更習語 - 模式也會描述它試圖在期望的行爲方面達到的目的,而一個習慣用語是你如何去做代碼中的事情。

除非它是一種與單個習慣用法有很強關聯的模式,否則不可能從代碼中反向工程模式。

1

此代碼段不代表catalog中的設計模式。 模式(單例除外)通常表示比設置可變的默認實現更復雜的關係。

+0

使用setInjector,你可以改變整個應用程序中使用的注入器的實現,加上我認爲getInstance是某種Fasade。這個頁面並不具有所有的設計模式 – IAdapter 2010-05-25 11:36:19

+1

沒有確切的「所有設計模式」列表 – 2010-05-25 11:38:06

+0

@Andreas Brink - 我同意需要像http://martinfowler.com/eaaCatalog/,GoF等sveral目錄 – stacker 2010-05-25 11:49:12

2

是的我同意這不是一個真正的任何模式的典型例子,但我看到依賴注入(顯然,它使用Guice)和工廠方法(getInstance())的元素。

+0

@Andreas:如果' .getInstance()'總是返回相同的對象(我認爲它是這樣做的),然後是的,這是一個單例。但是如果它可能返回單獨的實例(* DI'd對象被更新/替換,或許?*),那麼它是一種工廠方法。 – Esko 2010-05-25 11:38:14

+0

@Esko是的,我誤解了原來的代碼,這就是爲什麼我刪除了我的評論。 – 2010-05-25 11:39:20

+0

@Andreas:SO顯然緩存了一些評論,所以在我發佈我的回覆後顯示給我。不用擔心':) – Esko 2010-05-25 12:17:31