2009-07-03 26 views
0

我正在构建一个应用程序,随着时间的推移,我有更多的对象在启动时初始化。移动,一些较新的对象依赖于其他对象,所以我得到了一些spaggetti初始化,其中创建对象然后传递给其他构造函数。我怀疑我错了。启动时对象初始化的模式

例如我有一个WinForm接受一个“控制器”类和2个事件。该控制器需要从在WinForm告诉DataGridView的存在所以它有一个方法

Controller::SetDataGridReference(DataGridView^ dgv) 

有instanciating在启动对象,然后引用这些对象之间彼此的一般方法?

我被告知将所有必需的类作为构造函数参数是一种很好的做法,但坦率地说,我不明白我在这里如何做到这一点。

我真的不认为语言的重要

回答

5

这看起来像一个案例教材使用依赖注入(DI)。它一定会帮助您的意大利面代码,甚至可以协助进行单元测试。如果您想逐步向DI迁移,您可能需要考虑重构具有类似关系的对象,并使用几组工厂类来处理所有样板链初始化,并集中所有发生在代码库中的地方。

我可以推荐Google Guice作为Java的一个很好的DI框架。即使您不使用Java,它也是一个很好的DI模型,可与其他语言的DI框架进行比较。

1

使用控制器设计模式。

也就是说,创建一个SINGLE类,它将在程序初始化时实例化,称为Controller。在该类的构造函数中,创建所有其他对象。无论需要任何其他对象的对象都应该接受该对象作为其构造函数的参数。没有人,绝对没有任何其他对象应该在其构造函数上创建任何东西。将所有内容作为构造函数的参数传递。另外,在Controller类析构函数/ dispose中,以相反顺序调用所有对象析构函数/处理方法。这不会减少你的代码,但是如果稍后能够理解和调试,它会更好。

+0

这是(http://java.sun.com/blueprints/patterns/FrontController.html)你说的控制器设计模式?它似乎与我无关...... – paxos1977 2009-07-03 19:25:15

1

Dependency Injection应该在这里帮助:在应用程序启动时,您可以选择构建完整(或排序)的对象图形。您的应用程序的入口点将实例化您选择的DI容器,您只需请求根对象

例如Google Guice带有一个非常好的对象绘图器。

2

两种模式浮现在脑际可能适当的根据问题的具体情况:

  1. 抽象工厂模式。这可以使用或不使用@Scanningcrew建议的依赖注入方法。
  2. 调解员模式。构建一个中介。将介体传递给每个对象的构造函数。让每个对象都与中介注册。然后这些对象不需要明确地彼此了解。当你有一定数量的对象相互作用时,这很有效。
0

对于对象的交互,我会去Mediator。看看这个定义:“来封装如何一组对象进行交互的对象中介者称呼对方明确保留的对象促进了松散耦合,它可以独立地改变它们之间的相互作用。”

对于实例化,我会考虑依赖注入。请记住,您可以自由使用和混合设计模式来实现您的目标。