- 动机:解决简单工厂中增加新产品需要修改工厂逻辑
- 角色:
- 抽象工厂(一个)
- 具体工厂
- 抽象产品(一)
- 具体产品
- 结构:
4.优缺点:
-
- 优点:
- 用户只需要关心所需产品对应的工厂,无需关心创建细节,甚至无需知道具体产品类的类名
- 工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部
- 在系统中加入新产品时,无需修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了,符合“开闭原则”
- 缺点:
- 需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度(编译运行)
- 由于考虑到系统的可扩展性。在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。
- 优点:
5.用例:集合实现的Iterator接口、JMS、JDBC、电视机工厂、日志记录器(分类记录日志)、
代码:
/**
* 抽象产品
*
@author
ilmlife
*
<pre>
2013
-
12
-
3下午10:34:07
</pre>
*/
public
abstract
class
ImageReader {
public
abstract
void
reader();
}
/**
* 抽象工厂
*
@author
ilmlife(ilmlife @163.com)
*
<pre>
2013
-
12
-
3下午10:37:04
</pre>
*/
public
abstract
class
ImageReaderFactory {
public
abstract
ImageReader createReaderImage();
}
/**
* 具体产品
*
@author
ilmlife
*
<pre>
2013
-
12
-
3下午10:37:33
</pre>
*/
public
class
GifReader
extends
ImageReader {
@Override
public
void
reader() {
System.
out
.println(
"gif image reader...."
);
}
}
/**
* 具体产品
*
@author
ilmlife
*
<pre>
2013
-
12
-
3下午10:38:09
</pre>
*/
public
class
JpgReader
extends
ImageReader {
@Override
public
void
reader() {
System.
out
.println(
"jpg image reader...."
);
}
}
/**
* 具体工厂
*
@author
ilmlife
*
<pre>
2013
-
12
-
3下午10:37:55
</pre>
*/
public
class
GifReaderFactory
extends
ImageReaderFactory {
@Override
public
ImageReader createReaderImage() {
return
new
GifReader();
}
}
/**
* 具体工厂
*
@author
ilmlife
*
<pre>
2013
-
12
-
3下午10:38:20
</pre>
*/
public
class
JpgReaderFactory
extends
ImageReaderFactory {
@Override
public
ImageReader createReaderImage() {
return
new
JpgReader();
}
}