我有6个课程,如下图所示。我希望所有这些只被实例化一次,同时,我想避免单身。将在应用程序中首先创建Info
类对象,该对象从文件中读取系统的信息。在此对象A
之后,需要根据信息创建B
和C
。在需要创建此Server1
和Server2
个对象之后。 Server1
个对象想要访问A
个对象,而Server2
想要访问A
,B
,C
和Server1
个对象。< / p>
如何在不使用单例的情况下解决此问题?
谢谢!
的Subbarao
答案 0 :(得分:1)
如果您只想创建一次对象,那么您需要计算它创建的时间,否则您或其他程序员总是会意外地创建另一个实例。通常这是在局部静态变量的帮助下完成的,基本上是单例。
困难的部分是如何在整个程序中安排对象的访问。这可能是全局变量,静态方法或依赖注入,这取决于您的体系结构。 您可以在某个类中创建所有对象,然后使用getter访问它们。
最重要的是,如果你想保证只能创建一次对象,那么你正在寻找某种单例实现。
答案 1 :(得分:0)
在程序开头创建它们,删除副本并从这些类中移动构造函数,并将它们传递给依赖它们的类。您还可以在构造函数中确保通过静态类变量为每个类增加静态变量的计数器而只存在一个实例。如果它达到2,则抛出异常。这样你就可以保证唯一性。
答案 2 :(得分:0)
您可以创建普通类,然后由于类的使用体系结构,应该只合理地创建每个类的一个实例。这是使用依赖注入来替换单例。
一些类似工厂/类似main的方法将处理这些实例的加载/创建和传递给它们的每个依赖项。任何实例都不应该作为单例实例存在,而应该作为函数中的变量存在。
// No need for singleton patterns,
// but only one instance is ever created
// by the program's main function.
int main()
{
Info info = Info::LoadFromSystem("info.xml");
A a = A::CreateFromInfo(&info);
B b = B::CreateFromInfo(&info);
C c = C::CreateFromInfo(&info);
// dependency injection (use pointers or references, same essential thing)
Server1 server1 = new Server1(&a);
Server2 server2 = new Server2(&server1, &a, &b, &c);
server1.Run();
server2.Run();
// cleanup
return 0;
}