如何使用 pgf-umlcd 创建抽象工厂模式 UML?

如何使用 pgf-umlcd 创建抽象工厂模式 UML?

在此处输入图片描述

如何使用一个命令/任何简单的方法创建NYPizzaIngredientFactory关联?otherspgf-umlcd

在此处输入图片描述

主要是我想要unidirectionalassociation从一个源到多个目标。

我正在尝试这个-

\documentclass{article}
\usepackage{pgf-umlcd}
\begin{document}
\begin{tikzpicture}
  \begin{class}{Factory}{0,0}
    \attribute{}
    \attribute{}
    \operation{}
    \operation{}
  \end{class}

  \begin{class}{ProductA}{4,5}
    \attribute{}
    \attribute{}
    \operation{}
    \operation{}
  \end{class}

  \begin{class}{ProductB}{-2,5}
    \attribute{}
    \attribute{}
    \operation{}
    \operation{}
  \end{class}

  \begin{class}{ProductC}{-8,5}
    \attribute{}
    \attribute{}
    \operation{}
    \operation{}
  \end{class}
  \unidirectionalAssociation{Factory}{creates}{}{ProductA}
  \unidirectionalAssociation{Factory}{creates}{}{ProductB}
  \unidirectionalAssociation{Factory}{creates}{}{ProductC}
\end{tikzpicture}
\end{document}

输出 -

在此处输入图片描述

但是我不希望有 3 条线路进入Factory课堂。

答案1

如上所述,您无法真正按照\unidirectionalassociation其定义的方式做到这一点。也许可以重新定义,但我认为使用 TikZ 宏绘制这些箭头也不错。有几种方法可以做到这一点,我将在这里解释其中一种。

在下面的代码中,上完课后我做的第一件事是

  \draw [umlcd style] (Factory.north) -- ++(0,2cm)
                      coordinate (tmp)
                      node[right,midway] {creates};

这将使用 定义的样式绘制一条线pgf-umlcd,从类的顶部开始Factory,到高出 2cm 处结束。++表示坐标(0,2cm)是相对于前一个坐标的。然后我在该端点定义一个名为 的坐标tmp,稍后会用到。

我还在这条线的中间位置(就是这个意思)添加了一个节点(用于放置文本)midway,就在它的侧面。如果你不想要这条线旁边的right单词,请删除。(但createsnode[right,midway] {creates}删除结束路径所需的分号。

然后我从tmp上面定义的坐标开始绘制三条线,指向每个产品类别:

  \foreach \endpoint in {ProductA,ProductB,ProductC}
    \draw [umlcd style,fill=none,->] (tmp) -| (\endpoint.south)
                                     node[pos=0.75,right] {creates};

我在这里使用了一个循环,你也可以有三个单独的\draw语句。对于这些行,我fill=none,->除了添加之外还添加了umlcd style。第一个是必需的,因为样式设置了填充颜色,因此必须禁用填充。后者是激活行末尾的箭头提示所必需的。

该语法(a) -| (b)意味着 TikZ 不绘制直线,而是先从点 水平绘制a,然后垂直绘制到b

我再次添加一个节点,并且再次删除它(如果您不想要它)。通常pos=0.75意味着它应该放置在从 a 到 b 的 75% 路程的点上。但是,对于使用-|(或) 的路径,始终位于拐角处,因此位于拐角和路径末端之间的中间位置。|-pos=0.5pos=0.75

下面是输出和完整代码。

代码输出

\documentclass[border=5mm]{standalone}
\usepackage{pgf-umlcd}
\begin{document}
\begin{tikzpicture}
  \begin{class}{Factory}{0,0}
    \attribute{}
    \attribute{}
    \operation{}
    \operation{}
  \end{class}

  \begin{class}{ProductA}{4,5}
    \attribute{}
    \attribute{}
    \operation{}
    \operation{}
  \end{class}

  \begin{class}{ProductB}{-2,5}
    \attribute{}
    \attribute{}
    \operation{}
    \operation{}
  \end{class}

  \begin{class}{ProductC}{-8,5}
    \attribute{}
    \attribute{}
    \operation{}
    \operation{}
  \end{class}

  \draw [umlcd style] (Factory.north) -- ++(0,2cm)
                      coordinate (tmp)
                      node[right,midway] {creates};

  \foreach \endpoint in {ProductA,ProductB,ProductC}
    \draw [umlcd style,fill=none,->] (tmp) -| (\endpoint.south)
                                     node[pos=0.75,right] {creates};

\end{tikzpicture}
\end{document}

相关内容