设计模式-工厂模式

工厂模式包括:工厂方法模式和抽象工厂模式,可以说抽象工厂模式是在工厂方法模式基础上演变而来的。


工厂方法的作用就是:

原来我们要new一个产品A,则直接new ProductA(); 又来一个新需求要new一个产品B,则直接new ProductB(); 依此类推…

工厂的作用就是提供一个工厂类,由工厂类负责new ProductA()和new ProductB(),而我们只需要传入类型参数new一个工厂类就可以了,工厂类会根据类型来new相应的产品并返回。

注意在工厂方法中,产品A和产品B一般是没有关联的。

用类表示如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//Product接口
public interface Product {
}
//ProductA
public class ProductA implements Product {
}
//ProductB
public class ProductB implements Product {
}
//工厂类
public class ProductFactory {

public Product getProduct(String type) {
if ("A".equalsIgnoreCase ( type )) {
return new ProductA ();
} else if ("B".equalsIgnoreCase ( type ) ) {
return new ProductB ();
}
return null;
}
}

那什么是抽象工厂呢?抽象工厂要解决的问题是:要生成ProductA需要经过三个流程:选购原材料,加工原材料,组装,要生成ProductB也需要经过三个流程:选购原材料,加工原材料,组装,但是各自的流程处理方式都不一样,怎么办呢?

原来的做法是:直接在new Product里添加各自的流程,ProducA和ProductB的流程各自独立,客户端要使用时都是和具体的产品A或B打交道,紧耦合。

抽象工厂就是将生成ProductA的流程封装到一个工厂类ProductA中,将生成ProductB的流程也封装到一个工厂类ProductB中,然后将生成产品的流程抽象到共同的接口Product中,让ProductA和ProductB实现此接口,这么做的前提是工厂生产不同产品的流程是一样的。

现在需要生成产品的客户端只需要提供接口Product属性,具体需要生成ProductA则将此接口属性实例化为ProducA工厂,由具体工厂来执行具体的产品流程。

如果需要新增生成一个产品ProductC,只需要新增具体工厂类ProductC就可以了。

用类表示如下:

接着上面工厂方法的产品类,增加三个流程处理

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//原材料类
public class Material {
}
//组装成的模块类
public class Model {
}
//抽象工厂接口
public interface AbstractProductFactory {
Material buyMaterial();
Model process(Material material);
Product assemble(Model model);
}
//生产产品A的工厂类
public class ProductAFactory implements AbstractProductFactory {

@Override
public Material buyMaterial() {
return null;
}

@Override
public Model process(Material material) {
return null;
}

@Override
public Product assemble(Model model) {
return null;
}
}
//生产产品B的工厂类
public class ProductBFactory implements AbstractProductFactory {

@Override
public Material buyMaterial() {
return null;
}

@Override
public Model process(Material material) {
return null;
}

@Override
public Product assemble(Model model) {
return null;
}
}
//抽象工厂的使用类
public class UsageApp {
private AbstractProductFactory factory;

public UsageApp(AbstractProductFactory factory) {
this.factory = factory;
}

//UsageApp初始化时传入具体的工厂类,此方法即生产出相应的产品
public Product genProduct() {
return this.factory.assemble (
this.factory.process (
this.factory.buyMaterial ()
)
);
}
}

区别:工厂方法是对产品的扩展,抽象工厂是对生成产品的工厂的扩展

-------------本文结束感谢您的阅读-------------
Good for you!