首先,简单工厂:
1
2
3
4
5
6
7
8
9
10
11
12
|
public
class
SimplePhoneFactory {
public
static
Cellphone getCellphone(String type){
if
(
"iPhone"
.equals(type)){
return
new
IPhone();
}
else
if
(
"Samsung"
.equals(type)) {
return
new
Samsung();
}
else
{
throw
new
RuntimeException(
"没有正确的手机类型创建"
);
}
}
}
|
工厂方法:
1
2
3
4
5
6
|
/*
工厂方法接口
*/
public
interface
PhoneFactory {
public
Cellphone getPhone();
}
|
1
2
3
4
5
6
7
8
9
10
11
12
|
/*
* @Description: iPhone 工厂
*/
public
class
IPhoneFactory
implements
PhoneFactory{
@Override
public
Cellphone getPhone() {
// TODO Auto-generated method stub
return
new
IPhone();
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
|
/*
* @Description:samsung工厂
*/
public
class
SamsungPhoneFactory
implements
PhoneFactory{
@Override
public
Cellphone getPhone() {
// TODO Auto-generated method stub
return
new
Samsung();
}
}
|
以上代码可以看出,每个产品都需要自己的实现工厂,这时如果我们需要新增加新产品,比如小米手机,只需要新增一个MIPhoneFactory来实现PhoneFactory即可。
抽象工厂:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
public
interface
CPU {
void
run();
void
start();
}
//高端CPU
class
GoodCUP
implements
CPU{
@Override
public
void
run() {
System.out.println(
"高端CPU运转方法。。。"
);
}
@Override
public
void
start() {
System.out.println(
"高端CPU开始方法。。。"
);
}
}
//低端CPU
class
BadCPU
implements
CPU{
@Override
public
void
run() {
System.out.println(
"低端CPU运转方法。。。"
);
}
@Override
public
void
start() {
System.out.println(
"低端CPU开始方法。。。"
);
}
}
|
然后是相机接口,以及相关的相机生产类型,其中的方法是随便写的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public
interface
Camera {
public
void
take();
}
class
GoodCamera
implements
Camera{
@Override
public
void
take() {
System.out.println(
"高端相机拍照。。。"
);
}
}
class
BadCamera
implements
Camera{
@Override
public
void
take() {
System.out.println(
"低端相机拍照。。。"
);
}
}
|
最后一个内存的接口已经一系列类型:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public
interface
Memory {
void
work();
}
class
GoodMemory
implements
Memory{
@Override
public
void
work() {
System.out.println(
"高性能内存工作"
);
}
}
class
BadMemory
implements
Memory{
@Override
public
void
work() {
System.out.println(
"低性能内存工作"
);
}
}
|
我们前面说了,抽象工厂就是利用一些列组件组合产品的工厂,上面我们写的CPU,相机,内存都是我们要组件手机的组件。现在,我们开始写我们的抽象工厂。当然为了方便,肯定要有工厂接口:
1
2
3
4
5
|
public
interface
AbPhoneFactory {
CPU getCPU();
Camera getCamera();
Memory getMemory();
}
|
然后,我们根据自己的需要,随机组合几种组件,即可得到我们的产品,当然这是一组(产品)组合出来的最终产品。
比如我们用好的CPU,好的内存,好的相机组合成一个好的手机:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public
class
GoodsPhoneFactory
implements
AbPhoneFactory{
@Override
public
CPU getCPU() {
// TODO Auto-generated method stub
return
new
GoodCUP();
}
@Override
public
Camera getCamera() {
// TODO Auto-generated method stub
return
new
GoodCamera();
}
@Override
public
Memory getMemory() {
// TODO Auto-generated method stub
return
new
GoodMemory();
}
}
|
也可以用差的CPU,差的内存,差的相机组合成比较差劲的手机:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public
class
BadPhoneFactory
implements
AbPhoneFactory{
@Override
public
CPU getCPU() {
// TODO Auto-generated method stub
return
new
BadCPU();
}
@Override
public
Camera getCamera() {
// TODO Auto-generated method stub
return
new
BadCamera();
}
@Override
public
Memory getMemory() {
// TODO Auto-generated method stub
return
new
BadMemory();
}
}
|
当然你也可以乱组合成中等的,这都是随你便了,只要加一个工厂实现即可。
最后,我们来总结一下吧:
对于单一产品,简单工厂更简单,但是新增产品时却很乏力,或者说不符合设计原则,而工厂方法是不修改原有类的前提下,新增工厂类实现,更符合设计原则。是不是我们在单一产品的时候就该选择工厂方法了呢?下面给出这么一个对比:
-- 结构复杂度 简单工厂更加简单 简单工厂优于工厂方法
-- 代码复杂度 工厂方法复杂度较高 简单工厂优于工厂方法
-- 客户端编程难度 工厂方法客户端需要了解更多的实现工厂 简单工厂优于工厂方法
-- 管理难度 工厂方法由于实现工厂类较多,管理更难 简单工厂优于工厂方法
结合以上四点,我们说简单工厂比工厂方法更加易用。这也就是开发时候简单工厂比工厂方法使用的更多的原因。
对于产品族,如果使用工厂模式,唯一的选择--抽象工厂。