为什么我们需要抽象工厂设计模式来创建对象?为什么我们不能只使用new运算符? 答案是,避免紧密耦合对象。但我不知道怎么样?任何人都可以解释代码(将非常有用)。
是什么让抽象工厂设计模式变得有用以及什么时候。
提前致谢。 Harsha T
答案 0 :(得分:2)
如果您使用new
运算符,则必须指定所需的确切类型。
有时您希望更通用,例如,因为您希望能够快速更改所有代码库中的实例化类型。
答案 1 :(得分:2)
抽象工厂设计模式旨在在初始化时创建具有特定设置的对象。例如,如果你有很多类似的连接类,而不是重复相同的4+行[并使用复制和粘贴],抽象工厂将允许你将4+行保留在一个位置并减少需要改变。
答案 2 :(得分:2)
如果你有:
class Foo implements DoSomething {...}
class Bar implements DoSomething {...}
obj = new Foo();
obj.doSomething();
代码中的任何地方,一旦您想要更改 Foo 的所有实例以使用 Bar 的实例,您真的要进行搜索/替换吗?
如果你有:
obj = DoSomethingFactory.create();
obj.doSomething();
在DoSomethingFactory中,您可以返回任何实现 DoSomething 接口的对象。
通过使用Factory,您可以控制由其创建的所有对象。
如果您决定更改Factory创建对象的方式,则更改会立即在使用Factory的代码中生效。
答案 3 :(得分:1)
这是一个从我为我们的产品构建的版本独立层派生的简单示例:
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对象来决定基于某些版本标识符要创建的基础工厂。这允许我根据需要插入新版本而不会干扰现有的基础设施,这在这种情况下证明是有用的。事实上,如果我需要,它会允许我插入全新的产品,这通常很有用但在我的情况下不值得实施。
答案 4 :(得分:0)
Wikipedia上有一个相当不错的C#示例。它使您的应用程序级代码不必知道它正在获得哪些实现。工厂负责照顾它。
答案 5 :(得分:0)
使用抽象工厂,您可以在不知道实际类型的情况下创建对象。假设你需要一个IDictionary。您可以创建一个您碰巧知道的二叉树类的新实例,也可以告诉IDictionary-factory您需要一个新实例。然后其他人可以创建一个返回哈希表的工厂实现,但是你身边的一切仍然会以相同的方式工作。
答案 6 :(得分:0)
new
。工厂已经做了肮脏的工作