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,工厂方法是类设计模式。抽象工厂使用许多工厂方法。为什么抽象工厂是对象设计模式,而不是类设计模式?抽象工厂将实例化延迟到哪个对象?抽象工厂模式将产品对象的创建延迟到具体工厂子类。因为客户机期望工厂类(ConcreteFactory子类的父类)作为方法参数;根据传递的ConcreteFactory实例,创建相应的产品实例。所以抽象工厂通过调用运行时传递的具体工厂实例上的工厂方法来创建产品实例。因此,这就是对象设计模式。通常,这些混凝土工厂都是单身 然而,工厂方法发生在类级别。必须创建一个新的Conc

工厂方法是类设计模式。抽象工厂使用许多工厂方法。为什么抽象工厂是对象设计模式,而不是类设计模式?抽象工厂将实例化延迟到哪个对象?

抽象工厂模式将产品对象的创建延迟到具体工厂子类。因为客户机期望工厂类(ConcreteFactory子类的父类)作为方法参数;根据传递的ConcreteFactory实例,创建相应的产品实例。所以抽象工厂通过调用运行时传递的具体工厂实例上的工厂方法来创建产品实例。因此,这就是对象设计模式。通常,这些混凝土工厂都是单身

然而,工厂方法发生在类级别。必须创建一个新的ConcreteFactory类来实例化ConcreteProduct。此ConcreteFactory扩展了Factory类,该类具有返回产品的create()方法。ConcreteFactory重写在Factory父类中定义的create()方法

关于评论:


是的,工厂方法是参数化的,但在AbstractFactory中,您将能够对传递的ConcreteFactory调用方法,从而使您能够在运行时切换到不同的ConcreteFactory。但是在Factory中,由于create()是类的一部分,如果您想要创建具体的产品,您必须创建扩展父Factory类的ConcreteFactory。

谢谢您的回答。但我认为工厂方法也是参数化的,它的create()方法也在运行时被调用。我怎么了?请多解释一下。我对这个问题理解得更清楚了。我可以问你一个问题吗?好的,我的问题是:为什么我不能在运行时切换ConcreteFactory-in-Factory方法?如果我创建了一些具体的工厂,并将工厂类型转换成方法,那么我可以在运行时切换具体的工厂。@ BookCale-我会尝试回答你的问题,但是我们后退一步。应用这些模式的动机是不同的。在AbstractFactory中,您希望能够创建多个产品系列,但在Factory中,您为子类(具体工厂)提供了挂钩,以便能够创建具体产品。我知道这是一个古老的问答,但我想问一个类似的问题,这个答案并不能完全为我解释。在这两种模式中,必须在运行时创建一个ConcreteFactory对象的实例,并将其作为抽象基类传递和使用,而无需在编译时知道创建了哪个ConcreteFactory。那么,为什么一个是“类”模式,另一个是“对象”模式呢?