2011-09-06 72 views
3

当对象创建周围存在复杂性时,通常会使用工厂模式,并且复杂性会将创建范围无法访问(应该无法访问)的信息合并到一些必需的不可避免的变通方法中。具有工厂模式的单例模式争议

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

关于单例模式已经引发了很多争议。那么我应该让工厂仍然是单身人士吗?

工厂需要访问需要工厂生产某种产品的每个角落。这需要通过该工厂作为参数。并再次通过一个链。并且该链不会是单向的。这将很容易使分支机构。这也会导致测试困难。

+5

这是一个讨论主题,而不是一个问题。也许把它移到更相关的位置? – mydogisbox

+1

我同意mydogisbox。这是那些“取决于”的问题之一。 –

+0

任何原因,它必须是一个单身人士,不能只是一个独立的工厂功能? –

回答

0

不,你不应该这样做,实际上单身模式经常被看作是来自某人的反模式。

最好的事情是依靠一些IOC容器,避免两个单身都工厂模式。

+0

某人不是上帝。有人说它的反模式不是一个好的推理 –

+0

也许不是上帝本身,但有人比我更可靠 – Simone

+0

单身人士是一个反模式,因为信息是全球化的明显原因;我认为你同意我说全局变量是一个反模式 – Simone

2

我跟道格T.

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

这里的要点是,无论你做什么,只需将函数指针作为参数传递给工厂函数可能会更有意义。然后,您可以灵活地在那里存储创建逻辑,并且可以选择完全避免单身人士/额外班级。 (PS:我认为单身人士是一个很好的模式,但是如果你过度使用它们,它们会变成反模式,因为它们会将设计减少到仅仅具有全局函数和数据的状态)。

+0

是不是静态和Singleton差不多相同?并且工厂必须达到需要生产产品的每一端。传递和携带工厂的链条不是单向链条。它很容易分发。所以它会在测试时出现问题。 –

+1

@NeelBasu静态是静态的。你知道它们是静态的,因为这就是它在类型数据中所说的。单例假装不是静态的,但实际上有内部逻辑来确保你只使用一个实例(并且每次都使用该实例)。单身模仿静态行为,所以使用静态。 – Raynos

+0

@Neel Basu:Static和Singleton在概念上有些相似。您对该连锁店的评论很不清楚。 – Beta

3

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

+0

请查看编辑 –

+1

的最后部分@NeelBasu,我看到了,但我不认为Singleton是唯一的答案,或者它通常是最好的答案。全球接入不应成为支持糟糕的面向对象设计的拐杖。如果您创建的工厂远离使用它的地方,那可能意味着需要改变对象相互连接的方式。 – Caleb