让我们保持简单......
class Client
abstract class AbstractBusinessObject
class BusinessObject
class BusinessObjectFactory
好的,您的Client
需要在AbstractBusinessObject
上执行某些操作。显然,需要创建一个BusinessObject
实例。为什么不在客户端?什么是伤害?
我们假设您说服我在BusinessObjects
中创建新的BusinessObjectFactory
。大。现在工厂必须做繁重的工作。我们假设我的工厂有Create(DataRow row)
方法,因为我的BusinessObject
需要DataRow从中提取有用的信息。
我的BusinessObject's
属性为{get; private set;}
。因此,我无法在工厂中分配任何属性值。无论如何我可能不应该这样做。
然而,这意味着我必须完全传递DataRow
。所以基本上工厂只传递我的参数。这里工厂的用途是什么?
好的,我可能有BusinessObject
的不同实现 - 每个都有不同的构造函数。我想工厂知道如何构建任何特定的BusinessObject
是有道理的。但是我需要一个特定的工厂来获得具体的BusinessObject
。至少我看到的所有例子都表明了这一点。 ConcreteFactoryB
创建ConcreteProductB
(ConcreteFactoryA
创建ConcreteProductA
)客户如何知道如何构建工厂?或者甚至要创建哪一个?
啊工厂注入了......组成根。对。但我也可以直接注入BusinessObject。
DoFactory上的例子让我觉得更清楚一点。这是关于确保Lion
不吃Bisons
的全部内容吗?而Wolf
并不以Wildebeests
为依据?如果我只想创建一个对象,那么所有工厂都试图确保我不需要一个,对吧?
像this one here这样的工厂有意义吗?如果我只有一个只有一种类的一个 Create()
方法,那么工厂是否有意义?
真的,我读过很多关于它的内容。 每个例子都看起来像另一个。我错过了这一点:(任何人都可以提供一个清晰的现实世界的例子吗?
https://stackoverflow.com/a/2280289/1407618
去过那里,做到了......
答案 0 :(得分:2)
(看起来你接受了依赖注入(通常)有用的想法,所以我的答案就是基于这个假设。)
如果A的实例依赖于B的实例,并且您已经拥有B实例,那么您应该在不使用工厂的情况下将其注入A实例。但是,工厂在这些情况下非常有用:
答案 1 :(得分:2)
您使用Person
AbstractComputer
。你不关心电脑的制作,只要它具有AbstractComputer
所有的基本内容。现在,为了使用计算机,您自己会Create()
一个,还是会从ComputerStore
或ComputerProvider
获得?这些将为您提供最适合您需求的计算机(即您的预算,技能,屏幕尺寸)。他们从AbstractComputer
发送了ComputerFactory
,Create
知道如何AbstractComputer
他们最好。
至于Storage
的属性,有些人可以交换AbstractComputer
和有些人。这真的取决于你的背景。但是对于你的工厂将它们放入计算机内部,如果它们在构造之后不能交换,则它们需要一个入口点(构造函数)。
重要的一点是,Consumer
知道如何根据作品构建自己并不是{{1}}的责任。 {{1}}也不应该知道它需要哪种计算机(如果他们有足够的知识并且他们的需求永远不会更改),他们有时可以。