C# 创建对象的抽象工厂设计模式?为什么可以’;我们就不能用新的接线员吗?
为什么我们需要一个抽象的工厂设计模式来创建对象?为什么我们不能使用新的接线员呢? 答案是,避免对象的紧密耦合。但我不明白怎么做?任何人都可以用代码解释(将非常有用) 什么使抽象工厂设计模式有用以及何时有用 提前谢谢。C# 创建对象的抽象工厂设计模式?为什么可以’;我们就不能用新的接线员吗?,c#,design-patterns,C#,Design Patterns,为什么我们需要一个抽象的工厂设计模式来创建对象?为什么我们不能使用新的接线员呢? 答案是,避免对象的紧密耦合。但我不明白怎么做?任何人都可以用代码解释(将非常有用) 什么使抽象工厂设计模式有用以及何时有用 提前谢谢。 Harsha T如果使用新的运算符,则必须指定所需的确切类型。 有时您希望更通用,例如,因为您希望能够快速更改所有代码库中的实例化类型。抽象工厂设计模式用于在初始化时创建具有特定设置的对象。例如,如果您有许多类似连接的类,而不是重复相同的4+行[并使用复制和粘贴],抽象工厂将允许您
Harsha T如果使用
新的
运算符,则必须指定所需的确切类型。
有时您希望更通用,例如,因为您希望能够快速更改所有代码库中的实例化类型。抽象工厂设计模式用于在初始化时创建具有特定设置的对象。例如,如果您有许多类似连接的类,而不是重复相同的4+行[并使用复制和粘贴],抽象工厂将允许您将4+行保留在单个位置,并减少所需的更改量
有一个很好的C#示例。它使您的应用程序级代码不必知道它得到了哪些实现。工厂会处理它。使用抽象工厂,您可以在不知道实际类型的情况下创建对象。假设你需要一本词典。您可以创建一个碰巧知道的二叉树类的新实例,也可以告诉IDictionary工厂您需要一个新实例。然后,其他人可以创建一个返回哈希表的工厂实现,但您这边的一切都将以相同的方式工作。
- 首先,您不需要知道工厂正在实例化的对象的具体类型
- 然后,您可以在项目周围插入工厂类,让它们为组件实例化对象,而无需在代码中使用
。这家工厂已经在干脏活了new
- 从概念上讲,它将对象的实例化与它们的使用分开,保持事物的解耦
interface ICadSystemFactory
{
ICadSystem GetSystemInstance();
}
class 3dCadSystemVersion1 : ICadSystemFactory
{
ICadSystem GetSystemInstance()
{
return new 3dCadSystemWrapperVersion1(new 3dCadSystemVersion1());
}
}
class 3dCadSystemVersion2 : ICadSystemFactory
{
ICadSystem GetSystemInstance()
{
return new 3dCadSystemWrapperVersion2(new 3dCadSystemVersion2());
}
}
其中3dCadSystemWrapperVersionX对象实现ICadSystem接口。我使用Registry对象根据特定的版本标识符来决定要创建的基本工厂。这使我能够根据需要插入新版本,而不会干扰现有的基础设施,这在本例中非常有用。事实上,如果需要,它将允许我插入全新的产品,这通常是有用的,但在我的情况下,不值得实施努力。如果您有:
class Foo implements DoSomething {...}
class Bar implements DoSomething {...}
obj = new Foo();
obj.doSomething();
在代码中的任何地方,一旦您想将所有Foo实例更改为使用Bar实例,您真的要执行搜索/替换吗
如果您有:
obj = DoSomethingFactory.create();
obj.doSomething();
在DoSomethingFactory中,可以返回实现DoSomething接口的任何对象
通过使用工厂,您可以控制由其创建的所有对象
如果决定更改工厂创建对象的方式,则更改将在使用工厂的代码中立即生效 有这么多很好的解释(比如下面恩里科的链接)可以在一两个谷歌上找到,我真的认为在这里复制任何东西都没有价值。如果你发现一个似乎不令人信服的解释,也许一个关于该解释细节的问题会更有趣。