<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://wiki.eijux.com/index.php?action=history&amp;feed=atom&amp;title=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%9A%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F</id>
	<title>设计模式：抽象工厂模式 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.eijux.com/index.php?action=history&amp;feed=atom&amp;title=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%9A%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F"/>
	<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%9A%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F&amp;action=history"/>
	<updated>2026-05-15T18:51:02Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.38.2</generator>
	<entry>
		<id>http://wiki.eijux.com/index.php?title=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%9A%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F&amp;diff=2927&amp;oldid=prev</id>
		<title>Eijux：​/* 结构与实现 */</title>
		<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%9A%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F&amp;diff=2927&amp;oldid=prev"/>
		<updated>2021-05-08T13:00:01Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;结构与实现&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh-Hans-CN&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2021年5月8日 (六) 21:00的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l30&quot;&gt;第30行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第30行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;抽象工厂模式的主要角色如下：&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;抽象工厂模式的主要角色如下：&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;抽象工厂（Abstract &lt;/del&gt;Factory）：提供了创建产品的接口，它包含多个创建产品的方法 newProduct()，'''可以创建多个不同等级的产品'''。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;'''抽象工厂'''（Abstract &lt;/ins&gt;Factory）：提供了创建产品的接口，它包含多个创建产品的方法 newProduct()，'''可以创建多个不同等级的产品'''。&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;具体工厂（Concrete &lt;/del&gt;Factory）：主要是实现抽象工厂中的多个抽象方法，完成具体产品的创建。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;'''具体工厂'''（Concrete &lt;/ins&gt;Factory）：主要是实现抽象工厂中的多个抽象方法，完成具体产品的创建。&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;抽象产品（Product）：定义了产品的规范，描述了产品的主要特性和功能，抽象工厂模式有多个抽象产品。&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;'''抽象产品'''（Product）：定义了产品的规范，描述了产品的主要特性和功能，抽象工厂模式有多个抽象产品。&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;具体产品（ConcreteProduct）：实现了抽象产品角色所定义的接口，由具体工厂来创建，&lt;/del&gt;'''它同具体工厂之间是多对一的关系'''。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;'''具体产品'''（ConcreteProduct）：实现了抽象产品角色所定义的接口，由具体工厂来创建，&lt;/ins&gt;'''它同具体工厂之间是多对一的关系'''。&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;其结构图如下：&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;其结构图如下：&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Eijux</name></author>
	</entry>
	<entry>
		<id>http://wiki.eijux.com/index.php?title=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%9A%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F&amp;diff=2914&amp;oldid=prev</id>
		<title>Eijux：​/* 示例 */</title>
		<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%9A%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F&amp;diff=2914&amp;oldid=prev"/>
		<updated>2021-05-08T09:01:33Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;示例&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh-Hans-CN&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2021年5月8日 (六) 17:01的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l69&quot;&gt;第69行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第69行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;其结构图如下：&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;其结构图如下：&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;: &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[File:设计模式：抽象工厂模式：示例.png|600px]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;其代码如下：&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;其代码如下：&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Eijux</name></author>
	</entry>
	<entry>
		<id>http://wiki.eijux.com/index.php?title=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%9A%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F&amp;diff=2912&amp;oldid=prev</id>
		<title>Eijux：​建立内容为“category:设计模式  == 关于 == &lt;pre&gt; 前面介绍的“工厂方法模式”工厂方法模式只考虑生产同等级的产品（如畜牧场只养动…”的新页面</title>
		<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%9A%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F&amp;diff=2912&amp;oldid=prev"/>
		<updated>2021-05-08T08:59:38Z</updated>

		<summary type="html">&lt;p&gt;建立内容为“&lt;a href=&quot;/%E5%88%86%E7%B1%BB:%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F&quot; title=&quot;分类:设计模式&quot;&gt;category:设计模式&lt;/a&gt;  == 关于 == &amp;lt;pre&amp;gt; 前面介绍的“工厂方法模式”工厂方法模式只考虑生产同等级的产品（如畜牧场只养动…”的新页面&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[category:设计模式]]&lt;br /&gt;
&lt;br /&gt;
== 关于 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
前面介绍的“工厂方法模式”工厂方法模式只考虑生产同等级的产品（如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等）。&lt;br /&gt;
&lt;br /&gt;
而“抽象工厂模式”将考虑多等级产品的生产，将同一个具体工厂所生产的位于不同等级的一组产品称为一个'''产品族'''。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
抽象工厂（AbstractFactory）模式的定义：是一种'''为访问类提供一个创建一组相关或相互依赖对象的接口'''，且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
使用抽象工厂模式一般要满足以下条件：&lt;br /&gt;
# 系统中有多个产品族，每个具体工厂创建同一族但属于不同等级结构的产品。&lt;br /&gt;
# 系统一次只可能消费其中某一族产品，即同族的产品一起使用。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
优点：&lt;br /&gt;
*（具有工厂方法模式的优点）&lt;br /&gt;
* 可以在类的内部对产品族中相关联的多等级产品共同管理，而不必专门引入多个新的类来进行管理。&lt;br /&gt;
* 当需要产品族时，抽象工厂可以保证客户端始终只使用同一个产品的产品组。&lt;br /&gt;
* 抽象工厂增强了程序的可扩展性，'''当增加一个新的产品族时，不需要修改原代码，满足开闭原则'''。&lt;br /&gt;
缺点：&lt;br /&gt;
* '''当产品族中需要增加一个新的产品时，所有的工厂类都需要进行修改'''。增加了系统的抽象性和理解难度。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 结构与实现 ==&lt;br /&gt;
抽象工厂模式同工厂方法模式一样，也是由抽象工厂、具体工厂、抽象产品和具体产品等 4 个要素构成，但抽象工厂中方法个数不同，抽象产品的个数也不同。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
抽象工厂模式的主要角色如下：&lt;br /&gt;
# 抽象工厂（Abstract Factory）：提供了创建产品的接口，它包含多个创建产品的方法 newProduct()，'''可以创建多个不同等级的产品'''。&lt;br /&gt;
# 具体工厂（Concrete Factory）：主要是实现抽象工厂中的多个抽象方法，完成具体产品的创建。&lt;br /&gt;
# 抽象产品（Product）：定义了产品的规范，描述了产品的主要特性和功能，抽象工厂模式有多个抽象产品。&lt;br /&gt;
# 具体产品（ConcreteProduct）：实现了抽象产品角色所定义的接口，由具体工厂来创建，'''它同具体工厂之间是多对一的关系'''。&lt;br /&gt;
&lt;br /&gt;
其结构图如下：&lt;br /&gt;
: [[File:设计模式：抽象工厂模式.png|600px]]&lt;br /&gt;
&lt;br /&gt;
其代码如下：&lt;br /&gt;
# 抽象工厂：提供了产品的生成方法。&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
interface AbstractFactory {&lt;br /&gt;
    public Product1 newProduct1();&lt;br /&gt;
    public Product2 newProduct2();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# 具体工厂：实现了产品的生成方法。&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
class ConcreteFactory1 implements AbstractFactory {&lt;br /&gt;
    public Product1 newProduct1() {&lt;br /&gt;
        System.out.println(&amp;quot;具体工厂 1 生成--&amp;gt;具体产品 11...&amp;quot;);&lt;br /&gt;
        return new ConcreteProduct11();&lt;br /&gt;
    }&lt;br /&gt;
    public Product2 newProduct2() {&lt;br /&gt;
        System.out.println(&amp;quot;具体工厂 1 生成--&amp;gt;具体产品 21...&amp;quot;);&lt;br /&gt;
        return new ConcreteProduct21();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 示例 ===&lt;br /&gt;
# 抽象工厂类：AbstractFactory&lt;br /&gt;
# 工厂类：ShapeFactory、ColorFactory&lt;br /&gt;
# 抽象产品类：Shape、Color&lt;br /&gt;
# 产品类：Rectangle、Square、Circle；Red、Green、Blue&lt;br /&gt;
#（工厂创造器/生成器类：FactoryProducer）&lt;br /&gt;
测试类 AbstractFactoryPatternDemo 使用 FactoryProducer 来获取 AbstractFactory 对象，它将向 AbstractFactory 传递形状信息 Shape（CIRCLE / RECTANGLE / SQUARE），以便获取它所需对象的类型。同时它还向 AbstractFactory 传递颜色信息 Color（RED / GREEN / BLUE），以便获取它所需对象的类型。&lt;br /&gt;
&lt;br /&gt;
其结构图如下：&lt;br /&gt;
: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
其代码如下：&lt;br /&gt;
# 抽象工厂类：&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
public abstract class AbstractFactory {&lt;br /&gt;
   public abstract Color getColor(String color);&lt;br /&gt;
   public abstract Shape getShape(String shape) ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# 工厂类：&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
public class ShapeFactory extends AbstractFactory {&lt;br /&gt;
    &lt;br /&gt;
   @Override&lt;br /&gt;
   public Shape getShape(String shapeType){&lt;br /&gt;
      if(shapeType == null){&lt;br /&gt;
         return null;&lt;br /&gt;
      }        &lt;br /&gt;
      if(shapeType.equalsIgnoreCase(&amp;quot;CIRCLE&amp;quot;)){&lt;br /&gt;
         return new Circle();&lt;br /&gt;
      } else if(shapeType.equalsIgnoreCase(&amp;quot;RECTANGLE&amp;quot;)){&lt;br /&gt;
         return new Rectangle();&lt;br /&gt;
      } else if(shapeType.equalsIgnoreCase(&amp;quot;SQUARE&amp;quot;)){&lt;br /&gt;
         return new Square();&lt;br /&gt;
      }&lt;br /&gt;
      return null;&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   @Override&lt;br /&gt;
   public Color getColor(String color) {&lt;br /&gt;
      return null;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
public class ColorFactory extends AbstractFactory {&lt;br /&gt;
    &lt;br /&gt;
   @Override&lt;br /&gt;
   public Shape getShape(String shapeType){&lt;br /&gt;
      return null;&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   @Override&lt;br /&gt;
   public Color getColor(String color) {&lt;br /&gt;
      if(color == null){&lt;br /&gt;
         return null;&lt;br /&gt;
      }        &lt;br /&gt;
      if(color.equalsIgnoreCase(&amp;quot;RED&amp;quot;)){&lt;br /&gt;
         return new Red();&lt;br /&gt;
      } else if(color.equalsIgnoreCase(&amp;quot;GREEN&amp;quot;)){&lt;br /&gt;
         return new Green();&lt;br /&gt;
      } else if(color.equalsIgnoreCase(&amp;quot;BLUE&amp;quot;)){&lt;br /&gt;
         return new Blue();&lt;br /&gt;
      }&lt;br /&gt;
      return null;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# 抽象产品类：&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
public interface Shape {&lt;br /&gt;
   void draw();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
public interface Color {&lt;br /&gt;
   void fill();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# 产品类：&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
public class Rectangle implements Shape {&lt;br /&gt;
 &lt;br /&gt;
   @Override&lt;br /&gt;
   public void draw() {&lt;br /&gt;
      System.out.println(&amp;quot;Inside Rectangle::draw() method.&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
public class Square implements Shape {&lt;br /&gt;
 &lt;br /&gt;
   @Override&lt;br /&gt;
   public void draw() {&lt;br /&gt;
      System.out.println(&amp;quot;Inside Square::draw() method.&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
public class Circle implements Shape {&lt;br /&gt;
 &lt;br /&gt;
   @Override&lt;br /&gt;
   public void draw() {&lt;br /&gt;
      System.out.println(&amp;quot;Inside Circle::draw() method.&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
public class Red implements Color {&lt;br /&gt;
 &lt;br /&gt;
   @Override&lt;br /&gt;
   public void fill() {&lt;br /&gt;
      System.out.println(&amp;quot;Inside Red::fill() method.&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
public class Green implements Color {&lt;br /&gt;
 &lt;br /&gt;
   @Override&lt;br /&gt;
   public void fill() {&lt;br /&gt;
      System.out.println(&amp;quot;Inside Green::fill() method.&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
public class Blue implements Color {&lt;br /&gt;
 &lt;br /&gt;
   @Override&lt;br /&gt;
   public void fill() {&lt;br /&gt;
      System.out.println(&amp;quot;Inside Blue::fill() method.&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# 工厂创造器/生成器类：&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
public class FactoryProducer {&lt;br /&gt;
   public static AbstractFactory getFactory(String choice){&lt;br /&gt;
      if(choice.equalsIgnoreCase(&amp;quot;SHAPE&amp;quot;)){&lt;br /&gt;
         return new ShapeFactory();&lt;br /&gt;
      } else if(choice.equalsIgnoreCase(&amp;quot;COLOR&amp;quot;)){&lt;br /&gt;
         return new ColorFactory();&lt;br /&gt;
      }&lt;br /&gt;
      return null;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# 测试类：&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
public class AbstractFactoryPatternDemo {&lt;br /&gt;
   public static void main(String[] args) {&lt;br /&gt;
 &lt;br /&gt;
      //获取形状工厂&lt;br /&gt;
      AbstractFactory shapeFactory = FactoryProducer.getFactory(&amp;quot;SHAPE&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
      //获取形状为 Circle 的对象&lt;br /&gt;
      Shape shape1 = shapeFactory.getShape(&amp;quot;CIRCLE&amp;quot;);&lt;br /&gt;
      //调用 Circle 的 draw 方法&lt;br /&gt;
      shape1.draw();&lt;br /&gt;
 &lt;br /&gt;
      //获取形状为 Rectangle 的对象&lt;br /&gt;
      Shape shape2 = shapeFactory.getShape(&amp;quot;RECTANGLE&amp;quot;);&lt;br /&gt;
      //调用 Rectangle 的 draw 方法&lt;br /&gt;
      shape2.draw();&lt;br /&gt;
      &lt;br /&gt;
      //获取形状为 Square 的对象&lt;br /&gt;
      Shape shape3 = shapeFactory.getShape(&amp;quot;SQUARE&amp;quot;);&lt;br /&gt;
      //调用 Square 的 draw 方法&lt;br /&gt;
      shape3.draw();&lt;br /&gt;
 &lt;br /&gt;
      //获取颜色工厂&lt;br /&gt;
      AbstractFactory colorFactory = FactoryProducer.getFactory(&amp;quot;COLOR&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
      //获取颜色为 Red 的对象&lt;br /&gt;
      Color color1 = colorFactory.getColor(&amp;quot;RED&amp;quot;);&lt;br /&gt;
      //调用 Red 的 fill 方法&lt;br /&gt;
      color1.fill();&lt;br /&gt;
 &lt;br /&gt;
      //获取颜色为 Green 的对象&lt;br /&gt;
      Color color2 = colorFactory.getColor(&amp;quot;Green&amp;quot;);&lt;br /&gt;
      //调用 Green 的 fill 方法&lt;br /&gt;
      color2.fill();&lt;br /&gt;
 &lt;br /&gt;
      //获取颜色为 Blue 的对象&lt;br /&gt;
      Color color3 = colorFactory.getColor(&amp;quot;BLUE&amp;quot;);&lt;br /&gt;
      //调用 Blue 的 fill 方法&lt;br /&gt;
      color3.fill();&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#: 结果输出：&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
Inside Circle::draw() method.&lt;br /&gt;
Inside Rectangle::draw() method.&lt;br /&gt;
Inside Square::draw() method.&lt;br /&gt;
Inside Red::fill() method.&lt;br /&gt;
Inside Green::fill() method.&lt;br /&gt;
Inside Blue::fill() method.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eijux</name></author>
	</entry>
</feed>