Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 单件模式与工厂模式之争_C++_Oop_Design Patterns_Singleton - Fatal编程技术网

C++ 单件模式与工厂模式之争

C++ 单件模式与工厂模式之争,c++,oop,design-patterns,singleton,C++,Oop,Design Patterns,Singleton,当对象创建周围存在复杂性,并且复杂性包含创建范围无法访问(不应访问)的信息,或者创建包含一些强制性的不可避免的解决方法时,我通常使用factory模式 我经常将工厂设置为一个单独的工厂,因为不需要多个工厂。将同一工厂传递给多个类看起来很奇怪在参数中传递整个工厂 关于独生子女模式有很多争议。所以我还是应该把工厂变成单身汉吗 工厂需要通达到每个需要工厂生产某些产品的角落。这需要将工厂作为参数传递。然后再一次把它串起来。这条链条不会是单向的。这将很容易形成分支。这也会导致测试困难。不,您不应该这样做,

当对象创建周围存在复杂性,并且复杂性包含创建范围无法访问(不应访问)的信息,或者创建包含一些强制性的不可避免的解决方法时,我通常使用factory模式

我经常将工厂设置为一个单独的工厂,因为不需要多个工厂。将同一工厂传递给多个类看起来很奇怪<代码>在参数中传递整个工厂

关于独生子女模式有很多争议。所以我还是应该把工厂变成单身汉吗


工厂需要通达到每个需要工厂生产某些产品的角落。这需要将工厂作为参数传递。然后再一次把它串起来。这条链条不会是单向的。这将很容易形成分支。这也会导致测试困难。

不,您不应该这样做,事实上,单例模式通常被视为来自某个人的反模式

最好的办法是依靠一些IOC容器来避免单例和工厂模式。

我站在Doug T一边

您可以非常轻松地在类中创建静态函数,该函数可用于创建该类的实例(工厂函数)。更好的是,您可以创建一个factory类,并使factory类中的静态函数生成所需的对象。C#实际上提供了静态类,其中所有成员和函数都是静态的,不管怎样,它本质上是一个单例

这里的要点是,无论您做什么,只需将函数指针作为参数传递给工厂函数可能更有意义。这样,您就可以灵活地将创建逻辑存储在何处,并且可以选择完全避免单例/额外类


(注:我认为单例是一个好模式,但如果你过度使用它们,它们就会变成反模式,因为它们将设计简化为类似于只具有全局函数和数据的东西)。

类不必是单例就可以提供共享实例,事实上,您只有一个实例并不意味着该类必须是单实例。如果必须只有一个实例,那么就可以使用单例。工厂模式中没有任何东西要求您只有一个工厂——很容易想象有几个工厂,每个工厂配置不同,每个工厂创建的对象配置不同。

这是一个讨论主题,不是问题。也许把它移到一个更相关的地方?我同意我的Dogisbox。这是一个“视情况而定”的问题。为什么它必须是一个单例函数而不能只是一个独立的工厂函数?为什么将工厂传递给需要它的类看起来“奇怪”?它只是简单地表达了这些类对工厂的依赖性:有用的信息,使其成为全局的将隐藏起来。它还使类更易于测试-测试工具可以通过自己的工厂实现,工厂实现可以检查它是否被正确使用,而不引入对“真实”的依赖性有人不是上帝。有人说这是一个反模式不是一个好的理由,也许不是上帝本身,但有人比我和你更可靠,辛格尔顿是一个反模式,因为显而易见的原因,使信息全球化;我想你同意我的说法,全局变量是一种反模式。如果你解释一下原因,这个回答会更有帮助;单例模式中没有面向对象的东西,静态模式和单例模式不是差不多吗?工厂必须到达每一个需要如此生产产品的终端。通过和运送工厂的链条不是单向链条。它很容易分发。所以测试时会出现问题。@NeelBasu静力学是静态的。您知道它们是静态的,因为它在类型数据中就是这么说的。Singleton假装不是静态的,但实际上具有内部逻辑,以确保您只使用一个实例(并且每次都使用该实例)。单例模拟静态行为,所以使用静态来代替。@Neel Basu:静态和单例在概念上有点相似。您对该连锁店的评论非常不清楚。如果不清楚,我很抱歉。我想再次澄清一下,假设A,B,C,D,E五个需求工厂F,C和D都由B实例化,B由A实例化,E由D实例化,A在程序的入口点实例化。因此,工厂需要在创建时传递给A,然后再次传递给B,以便B可以使用它。A->B,B->C,B->D和D->E。它不限于5(A..E)。它甚至可能会变大,然后链不再是一条链,而是变成一棵树。然后它就变得更难测试了。请检查测试的最后一部分Edit@NeelBasu,我看到了,但我不认为单身是唯一的答案,也不认为这通常是最好的答案。全局访问不应该成为支持糟糕的OO设计的支柱。如果要在远离使用工厂的地方创建工厂,则可能需要更改对象之间的连接方式。