工厂模式和我的无能。帮我看看光明

时间:2015-02-05 20:21:21

标签: c# design-patterns factory factory-pattern

让我们保持简单......

class Client  
abstract class AbstractBusinessObject  
class BusinessObject  
class BusinessObjectFactory  
  1. 好的,您的Client需要在AbstractBusinessObject上执行某些操作。显然,需要创建一个BusinessObject实例。为什么不在客户端?什么是伤害?

  2. 我们假设您说服我在BusinessObjects中创建新的BusinessObjectFactory。大。现在工厂必须做繁重的工作。我们假设我的工厂有Create(DataRow row)方法,因为我的BusinessObject需要DataRow从中提取有用的信息。
    我的BusinessObject's属性为{get; private set;}。因此,我无法在工厂中分配任何属性值。无论如何我可能不应该这样做。 然而,这意味着我必须完全传递DataRow。所以基本上工厂只传递我的参数。这里工厂的用途是什么?

  3. 好的,我可能有BusinessObject的不同实现 - 每个都有不同的构造函数。我想工厂知道如何构建任何特定的BusinessObject是有道理的。但是我需要一个特定的工厂来获得具体的BusinessObject。至少我看到的所有例子都表明了这一点。 ConcreteFactoryB创建ConcreteProductBConcreteFactoryA创建ConcreteProductA)客户如何知道如何构建工厂?或者甚至要创建哪一个?

  4. 啊工厂注入了......组成根。对。但我也可以直接注入BusinessObject。

  5. DoFactory上的例子让我觉得更清楚一点。这是关于确保Lion不吃Bisons的全部内容吗?而Wolf并不以Wildebeests为依据?如果我只想创建一个对象,那么所有工厂都试图确保我不需要一个,对吧?

  6. this one here这样的工厂有意义吗?如果我只有一个只有一种类的一个 Create()方法,那么工厂是否有意义?

    真的,我读过很多关于它的内容。 每个例子都看起来像另一个。我错过了这一点:(任何人都可以提供一个清晰的现实世界的例子吗?

    https://stackoverflow.com/a/2280289/1407618
    去过那里,做到了......

2 个答案:

答案 0 :(得分:2)

(看起来你接受了依赖注入(通常)有用的想法,所以我的答案就是基于这个假设。)

如果A的实例依赖于B的实例,并且您已经拥有B实例,那么您应该在不使用工厂的情况下将其注入A实例。但是,工厂在这些情况下非常有用:

  • 延迟加载:你在创建A时没有B,所以A需要创建自己的B(不知道B的确切类型,也可能不知道(全部)B&# 39; s依赖)。
  • 可选装载:在某些情况下,甚至可能不需要装载B,是否必要,必须由A确定。
  • 多个实例:A可能需要在需要时创建多个B实例。
像往常一样,没有任何模式是银弹,所以在很多情况下工厂或依赖注入都是过度杀伤。您对工厂实用性的质疑是好的,并且可能会导致您仅在实际有益的情况下使用该模式。

答案 1 :(得分:2)

您使用Person AbstractComputer。你不关心电脑的制作,只要它具有AbstractComputer所有的基本内容。现在,为了使用计算机,您自己会Create()一个,还是会从ComputerStoreComputerProvider获得?这些将为您提供最适合您需求的计算机(即您的预算,技能,屏幕尺寸)。他们从AbstractComputer发送了ComputerFactoryCreate知道如何AbstractComputer他们最好。

至于Storage的属性,有些人可以交换AbstractComputer和有些人。这真的取决于你的背景。但是对于你的工厂将它们放入计算机内部,如果它们在构造之后不能交换,则它们需要一个入口点(构造函数)。

重要的一点是,Consumer知道如何根据作品构建自己并不是{{1}}的责任。 {{1}}也不应该知道它需要哪种计算机(如果他们有足够的知识并且他们的需求永远不会更改),他们有时可以。