Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建对象的抽象工厂设计模式?为什么可以’;我们就不能用新的接线员吗?_C#_Design Patterns - Fatal编程技术网

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接口的任何对象

通过使用工厂,您可以控制由其创建的所有对象


如果决定更改工厂创建对象的方式,则更改将在使用工厂的代码中立即生效

有这么多很好的解释(比如下面恩里科的链接)可以在一两个谷歌上找到,我真的认为在这里复制任何东西都没有价值。如果你发现一个似乎不令人信服的解释,也许一个关于该解释细节的问题会更有趣。