抽象工厂设计模式来创建对象?为什么我们不能只使用new运算符?

时间:2010-06-03 14:31:01

标签: c# design-patterns

为什么我们需要抽象工厂设计模式来创建对象?为什么我们不能只使用new运算符? 答案是,避免紧密耦合对象。但我不知道怎么样?任何人都可以解释代码(将非常有用)。

是什么让抽象工厂设计模式变得有用以及什么时候。

提前致谢。 Harsha T

7 个答案:

答案 0 :(得分:2)

如果您使用new运算符,则必须指定所需的确切类型。 有时您希望更通用,例如,因为您希望能够快速更改所有代码库中的实例化类型。

答案 1 :(得分:2)

抽象工厂设计模式旨在在初始化时创建具有特定设置的对象。例如,如果你有很多类似的连接类,而不是重复相同的4+行[并使用复制和粘贴],抽象工厂将允许你将4+行保留在一个位置并减少需要改变。

Reference For Abstract Factory

答案 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。工厂已经做了肮脏的工作
  • 它在概念上将对象的实例化与其使用分开,保持事物解耦