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 澄清工厂方法设计模式的UML类图_Design Patterns_Uml_Factory Pattern - Fatal编程技术网

Design patterns 澄清工厂方法设计模式的UML类图

Design patterns 澄清工厂方法设计模式的UML类图,design-patterns,uml,factory-pattern,Design Patterns,Uml,Factory Pattern,我正在学习工厂方法设计模式,在一个教程中发现了下面的类图。我理解产品和具体产品部分,但创建者和具体创建者部分在我看来有点模糊。如果有人澄清UML图,我将不胜感激。谢谢 工厂方法模式描述了封装和委托类型实例化的方法。工厂方法通常以Create。。。e、 g.Creator.CreateSpecializedObject()和定义的摘要 此模式的目的是将已使用对象实例的实例化和初始化从调用方或使用者(超类或基类)委托给更专门的子类 由于工厂方法应该返回生成实例的抽象类型,因此使用者(例如超类/基类)

我正在学习工厂方法设计模式,在一个教程中发现了下面的类图。我理解产品和具体产品部分,但创建者和具体创建者部分在我看来有点模糊。如果有人澄清UML图,我将不胜感激。谢谢
工厂方法模式描述了封装和委托类型实例化的方法。工厂方法通常以Create。。。e、 g.
Creator.CreateSpecializedObject()
和定义的摘要

此模式的目的是将已使用对象实例的实例化和初始化从调用方或使用者(超类或基类)委托给更专门的子类

由于工厂方法应该返回生成实例的抽象类型,因此使用者(例如超类/基类)可以提前创建和使用生成类型的实例,而不知道具体实现。消费者只对抽象进行操作

Factory方法允许为需要对抽象类型的实例进行操作的类型实现默认行为。这个抽象类型的专门实现随后由继承者提供,继承者必须重写/实现抽象工厂方法来返回这个类型

向下滚动查看此模式的简要示例


在UML模型语言中,类成员(如字段)称为属性,方法称为操作。在UML中,任何东西都有其含义,例如符号、线条的笔划样式、箭头设计和字体格式(如斜体字母)

图表显示:

a)我们有一个抽象类型
产品

我们知道它是抽象的,因为类名是用斜体字母写的

b)有一个具体的类别
ConcreteProduct

我们知道它是具体的,即一个实现,因为类名是用普通字母写的

c)
ConcreteProduct
指向
Product
的箭头说明
ConcreteProduct
继承了
Product
Generalization
)。
我们知道它,因为空心箭头总是象征继承,并且总是从子类(继承类型)指向超类(基类型,子类的泛化)

此箭头表示:“{type_B}是{type_A}的子类”

或者,{type_B}没有
工厂
设计模式(在GoF的书中)。您包含的图表接近
工厂方法
方法
是名称的重要部分,不能忽略

您包含的图表看起来像是GoF书中类图的复制品。不幸的是,您的复制品遗漏了一些关键点。下面是GoF书中的图表。

工厂方法
模式是
模板方法
的特例(或至少如上面的类图所示)

如果我们把它放在序列图中,我通常会发现更容易理解:


^
工厂方法
不必在
模板方法
中与一起使用
抽象工厂
是使用
工厂方法
的另一个示例。感谢您的回答。看起来像factoryMethod()应采用产品类型的参数。根据图表,该方法是无参数的。但您可以添加一些参数来控制“产品”或要生产的类型的配置。代替参数,您还可以公开多个更专业的工厂方法或重载。您会注意到,您的图表与小鹏的GOF图表不同因为
FactoryMethod()
在后者中是斜体,而不是在您的方法中。将方法斜体化是正确的,因为它是抽象的。这需要
ConcreteCreator
来实现它。