这种编程方法叫什么?这不好吗?

What is this programming method called? And is it bad?

最近在我的 Unity 项目中,我发现要创建一个更加模块化的应用程序,在 class 中有一个静态列表会有所帮助,其中包含对创建的所有或部分对象的引用,以便它们可以可以从程序的其他部分轻松访问。示例如下:

private static List<Canvas> availableCanvases = new List<Canvas>();

void Start () {
    availableCanvases.Add(this);
}

public static void AddComponentToCanvas(Transform component) {
    for (int i = 0; i < availableCanvases; i++) {
        //Make sure the canvas still exists
        if (availableCanvases[i] != null) {
            component.SetParent(availableCanvases[i]);
            return;
        } else {
            availableCanvases.RemoveAt(i);
            i--;
        }
    }

    //Reached if no canvas found
    //Create new canvas or create error etc...
}

这仅允许在运行时实例化的对象将自身添加到可用的 canvas,而无需通过 findWithTag 或 findWithType 方法访问它,如果使用过多会损害性能。

这种做法是好是坏?我的同事认为这代表了单例编程,但它当然不是,因为它允许存在和使用多个对象。

这本质上是一个 Service Locator "Anti Pattern",它(令人惊讶)基于单例模式。但是,您不是检索服务实例,而是检索对象实例。

不管名称如何,这实际上并没有创建更加模块化的应用程序。相反,您在整个应用程序中创建了硬依赖性,这使得将其拆分为各个组件变得更加困难。

Martin Fowler 很好地记录了该模式。您可以找到更多信息 here.