工厂对象由于依赖于自身而导致堆栈流量异常

本文关键字:堆栈 流量 异常 对象 依赖于 工厂 | 更新日期: 2023-09-27 18:00:24

我有一个c#工厂对象,它通过工厂方法创建对象,使用对象列表作为源。

对象列表是这样创建的:

public WidgetFactory()
    {
        widgetLibrary = new List<WidgetModel>();
        //Add all widgets
        widgetLibrary.Add(new ClientsWidget());
        widgetLibrary.Add(new InstallationsWidget());
        etc.

我的应用程序的各个部分以不同的方式访问该列表,以获得所需的对象类型。

但我现在有一个要求,即列表中的一个对象(即小部件)需要使用小部件工厂本身。显然,这会引起循环引用。

我怎样才能改变我的设计来适应这种需要?

工厂对象由于依赖于自身而导致堆栈流量异常

但我现在有一个要求,即列表中的一个对象(即小部件)需要使用小部件工厂本身。显然,这会引起循环引用。

我怎样才能改变我的设计来适应这种需要?

通常,对象不应该依赖于创建它们的工厂进行构造,因为这正是导致此问题的原因。如果你可以将引用推送到工厂,但在需要之前不使用它,这可能会解决问题。

如果您绝对需要这样做,那么最好的方法可能是在工厂内惰性地实例化对象。您可以使用List<Lazy<WidgetModel>>,而不是让WidgetFactory在内部包含List<WidgetModel>。这将允许个人";小部件";只根据需要进行评估,这意味着,当有问题的小部件尝试引用工厂时,它将被完全加载。

但我现在有一个要求,即列表中的一个对象(即小部件)需要使用小部件工厂本身。显然,这会引起循环引用。

我怎样才能改变我的设计来适应这种需要?

你的模型错了。一旦一辆汽车离开NUMMI工厂的装配线,它就不依赖于工厂的正常运行。

此外,我对你们工厂的设计提出质疑。为什么new实例是构造函数。这有什么用?

你可能应该告诉我们更多关于你的模型的信息,以及你为什么认为你需要这个。很可能,做得好,你不会。

WidgetFactory的构造函数不应该调用它正在构建的东西的构造函数。相反,WidgetFactory应该有一个完成所有工作的方法(BuildWidgets)。

然后,其他对象可以在一定程度上利用工厂,而不会导致这一连串的活动重新开始。

首先,将Widget创建从WidgetFactory的构造函数中移出。这应该在初始化方法中发生,或者在CreateWidget(Type)方法中按需发生。

要使工厂实例可用于Widget实例,可以执行以下几种不同的操作之一:

  1. 让WidgetFactory在创建Widget时传递"this"
  2. 使用singleton模式:添加一个静态属性WidgetFactory.Instance并初始化一次;让所有WidgetFactory用户访问该属性,而不是创建一个新实例
  3. 使用依赖注入模式——这里很难提供简短的描述