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
Design patterns 抽象工厂模式_Design Patterns - Fatal编程技术网

Design patterns 抽象工厂模式

Design patterns 抽象工厂模式,design-patterns,Design Patterns,这是关于抽象的工厂模式 我们知道有两种方法可以使用,即 直接创建混凝土类的实例,或者 提供一个接口,通过它我们可以访问具体的类 有人能告诉我优势/劣势吗?如果我使用选项1,那么这些问题可能会发生,如果可能的话,通过实时示例,反之亦然 提前感谢…直接创建对象当然是非常容易的(C#中的示例): 虽然很容易,但它会导致紧密耦合,因为您无法独立于使用者改变实例 虽然更复杂,但使用抽象工厂的消费者是松散耦合的: public class Consumer() { private readonly

这是关于抽象的工厂模式

我们知道有两种方法可以使用,即

  • 直接创建混凝土类的实例,或者
  • 提供一个接口,通过它我们可以访问具体的类
  • 有人能告诉我优势/劣势吗?如果我使用选项1,那么这些问题可能会发生,如果可能的话,通过实时示例,反之亦然


    提前感谢…

    直接创建对象当然是非常容易的(C#中的示例):

    虽然很容易,但它会导致紧密耦合,因为您无法独立于使用者改变实例

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

    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");
        }
    }
    
    这看起来比第一个版本复杂得多,但现在您可以独立于
    消费者
    改变
    f
    的实现

    您不仅可以更改实现,还可以重用在不同使用者之间共享实例


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

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


    如果您有一个包含多个具体子类的接口/抽象类,并且希望能够在不将客户机绑定到任何子类的情况下改变实现—这就是使用(或)时的情况。

    在此处查找抽象工厂模式,这样您就不必将具体的实例化直接硬编码到代码中。而是委托给创建“产品”的工厂对象。所以我不知道你说的选项1是什么意思。
    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");
        }
    }