单一模式争议与工厂模式

时间:2011-09-06 17:14:52

标签: c++ oop design-patterns singleton

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

通常我将工厂设为单身,因为不需要多个工厂。并将同一工厂传递给多个类看起来很奇怪。 passing a whole Factory in parameter

关于Singleton Pattern存在很多争议。那么我应该让工厂成为单身人士吗?

工厂需要能够到达需要工厂生产某些产品的每个角落。这需要将该工厂作为参数传递。并再次传递给一个链。那条链不会是单向的。这将很容易成为分支机构。这也会导致测试困难。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

我会支持Doug T。

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

这里的要点是,无论你做什么,简单地将函数指针作为参数传递给工厂函数可能更有意义。您可以灵活地存储创建逻辑的位置,然后您可以选择完全避免单例/额外类。

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

答案 2 :(得分:0)

不,你不应该,事实上,单身人士模式通常被视为来自某人的反模式。

最好的办法是依靠一些IOC容器,避免单独使用工厂模式。