首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抽象工厂模式

抽象工厂模式
EN

Stack Overflow用户
提问于 2010-06-11 12:10:44
回答 2查看 541关注 0票数 3

是关于抽象工厂模式的。

正如我们所知,我们可以使用两种方法,即

  1. 直接创建具体类的实例,或者
  2. 提供一个可以访问具体类的接口。

如果我使用选项1,那么这些问题可能会发生,或者反之亦然,如果可能的话,有人能告诉我优势/dis-优势吗?

提前谢谢..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-11 12:33:19

如果您有一个没有子类的具体类,并且您确信它永远不会存在,那么您可以像在您的选项1中那样实例化它--因此不需要工厂。

如果您有一个带有几个具体子类的接口/抽象类,并且您希望能够更改实现,而不需要将客户机绑定到其中的任何一个--这就是您使用工厂 (或依赖注入)的时候。

票数 0
EN

Stack Overflow用户

发布于 2010-06-11 12:31:52

直接创建对象肯定是easy (C#中的示例):

代码语言:javascript
复制
public class Consumer()
{
    public void DoStuff()
    {
        var f = new Foo()
        f.DoIt("bar");
    }
}

虽然简单,但它会导致紧耦合,因为您不能独立于使用者更改实例。

虽然是更复杂的,使用抽象工厂的消费者是松散耦合的

代码语言:javascript
复制
public class Consumer()
{
    private readonly IFooFactory fooFactory;

    public Consumer(IFooFactory fooFactory)
    {
        if (fooFactory == null)
        {
            throw new ArgumentNullException("fooFactory");
        }

        this.fooFactory = fooFactory;
    }

    public void DoStuff()
    {
        var f = this.fooFactory.Create();
        f.DoIt("bar");
    }
}

这看起来比第一个版本复杂得多,但是现在您可以独立于Consumer来改变Consumer的实现。

您不仅可以通过更改实现,而且还可以在不同的使用者之间重用共享实例。

在许多情况下,您不需要抽象工厂来启用松耦合。通常,您可以直接将依赖注入到消费者,而不是诉诸于额外的间接级别。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3022557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档