这是什么设计模式?

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
6
设计模式的存在是为了帮助你构建事物。不要过于拘泥于它们,否则它们就会开始妨碍你。 - samoz
1
“我们在编程中所做的一切都可以被描述为设计模式” 在某种程度上是正确的,但其中一些模式像“意大利面代码”等都有名称,并且实际上是反模式。 - Sean Patrick Floyd
2
喜欢这篇来自Christer Ericson的博客文章 http://realtimecollisiondetection.net/blog/?p=44 " - Andreas Brinck
3个回答

2

我同意,这并不是任何一种设计模式的典型示例,但我看到了依赖注入(显然,它使用了Guice),以及一个工厂方法(getInstance())的元素。


@Andreas:如果.getInstance()始终返回相同的对象(我认为是这样),那么是单例模式。但是,如果它有可能返回不同的实例(DI对象被更新或替换,也许?),则它就是工厂方法。 - Esko
@Esko 是的,我误读了原始代码,这就是为什么我删除了我的评论。 - Andreas Brinck
@Andreas:显然SO会对评论进行一段时间的缓存,所以我在发布回复后仍然可以看到它。不过没关系 :) - Esko

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

这段代码片段并不代表目录中的设计模式。 除了单例模式之外,模式通常表示比设置可更改的默认实现更复杂的关系。


使用setInjector,您可以更改整个应用程序中使用的注入器实现。此外,我认为getInstance是某种Fasade。此页面并不包含所有设计模式,只有一些常见的已知模式。 - IAdapter
1
没有一个明确的“所有设计模式”的列表。 - Andreas Brinck
@Andreas Brink - 我同意需要几个类别,例如http://martinfowler.com/eaaCatalog/,GoF等。 - stacker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接