在抽象工厂模式中,不仅有抽象工厂,还有抽象零件和抽象产品。抽象工厂的作用是将抽象零件组装为抽象产品。
类图:
这里大约分为3部分。左上角Item
类是抽象的零件,便于统一处理Tray
和Link
,使其具有可替换性。ListLink
和ListTray
是具体的零件。ListTray
是具有多个Link
的集合。
右上角的Page
是抽象的产品,代表一个页面。页面上有许多Item
(可以是Link
或者TrayLink
)。ListPage
是具体的产品,实现了MakeHTML()
方法。
左下角Factory
是抽象工厂,ListFactory
是具体工厂,用于创建一个列表风格的页面。
结果:
代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18package factory;
public abstract class Factory {
public static Factory getFactory(String classname) {
Factory factory = null;
try {
factory = (Factory)Class.forName(classname).newInstance();
} catch (ClassNotFoundException e) {
System.err.println("没有找到 " + classname + "类。");
} catch (Exception e) {
e.printStackTrace();
}
return factory;
}
public abstract Link createLink(String caption, String url);
public abstract Tray createTray(String caption);
public abstract Page createPage(String title, String author);
}
1 | package factory; |
1 | package factory; |
1 | package factory; |
1 | package factory; |
1 | package listfactory; |
1 | package listfactory; |
1 | package listfactory; |
1 | package listfactory; |
1 | import factory.*; |
增加新的工厂
如果只用到ListFactory,那就使用抽象工厂模式没有意义了。假如现在需要一个表格格式的页面,那么就可以使用抽象工厂模式整体的替换工厂、产品、零件。
类图:
具体的代码就不上了,体会这种思想即可。
结果:
与工厂模式的区别:
抽象工厂模式多了一个零件的层级,而工厂模式产出产品。假如有一个汽车工厂,生产多个品牌的车,这时就需要抽象工厂模式。因为汽车由发动机、底盘、变速箱等部件组成。每生产一个具体品牌的车就整体替换工厂、产品、零件。又假如有一家供应商向汽车厂供应零部件比如挡风玻璃,那么使用工厂模式即可,产出适合不同品牌的挡风玻璃。
缺点
难以增加具体的零件。以本题例子,假如现在需要在网页中增加一个图片零件,那么就需要添加新的代表图片的类,更改所有的具体工厂才行。