抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

设计模式之—-工厂模式

工厂模式(Factory Pattern)是java中最常用的设计模式之一,这种类型设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象是不会对客户暴露创建逻辑,并且是通过使用一个共同的接口,以此来达到解耦的目的。

下面的例子以造车为例来说明三种模式。

分类

1、简单工厂模式 (Simple Factory)

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
public abstract class Car {
}
public enum CarType {
BMW, AUDI, DAZHONG;
}

public class BmwCar extends Car{
public BmwCar(){
System.out.println("这是宝马车");
}
}
public class AudiCar extends Car{
public AudiCar(){
System.out.println("这是奥迪车");
}
}
public class DaZhongCar extends Car {
public DaZhongCar() {
System.out.println("这是大众车");
}
}

public class CarFactory {
/**
* 静态工厂方法
*
* @param carType 车的类型
* @return 车的对象
*/
public static Car createCar(CarType carType) {
switch (carType) {
case BMW:
return new BmwCar();
case AUDI:
return new AudiCar();
case DAZHONG:
return new DaZhongCar();
default:
return null;
}
}

public static void main(String[] args) {
CarFactory.createCar(CarType.AUDI);
}
}


输出:

1
2
3
这是奥迪车

Process finished with exit code 0

这种工厂模式,已经完成了我们工厂模式的基本的需求,创建对象和解耦
缺点:
1、用户调用需要知道自己要创建的对象在工厂中的类型
2、拓展很麻烦,如果新增一个产品,需要在产品的具体创建对象的实现,还需使工厂支持创建这种产品,这显然是违背开闭原则的

2、工厂方法模式(Factory Method)

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
public interface Factory {
/**
* 生产车的方法
* @return 车的对象
*/
Car createCar();
}
public class AudiFactory implements Factory{
@Override
public Car createCar() {
return new AudiCar();
}
}
public class BmwFactory implements Factory{
@Override
public Car createCar() {
return new BmwCar();
}
}
public class DaZhongFactory implements Factory{
@Override
public Car createCar() {
return new DaZhongCar();
}
}

//客户使用
public class ConsumerTest {
public static void main(String[] args) {
final BmwFactory bmwFactory = new BmwFactory();
bmwFactory.createCar();
}
}

输出:

1
2
3
这是宝马车

Process finished with exit code 0

工厂方法模式组成:
1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

方法工厂模式和简单工厂模式最大的不同,就是将实现交给了具体的工厂,核心工厂只提供产品线,具体的实现工厂只需要去实现对应的需求即可。如果新增产,只需要去实现对应的产品工厂即可,显然这种方式是符合开闭原则的

3、抽象工厂模式 (Abstract Factory)

个人觉得抽象工厂模式和工厂方法模式区别不是很大。

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
public interface Factory {
/**
* 生产车的方法
*
* @return 车的对象
*/
Car createCar();

/**
* 获取价钱
*
* @return 价钱
*/
double pricing();
}

public class AudiFactory implements Factory {
@Override
public Car createCar() {
return new AudiCar();
}

@Override
public double pricing() {
System.out.println("定价:20_0000");
return 20_0000;
}
}
public class BmwFactory implements Factory {
@Override
public Car createCar() {
return new BmwCar();
}

@Override
public double pricing() {
System.out.println("定价:25_0000");
return 25_0000;
}
}
public class DaZhongFactory implements Factory {
@Override
public Car createCar() {
return new DaZhongCar();
}

@Override
public double pricing() {
System.out.println("定价:18_0000");
return 18_0000;
}
}

//客户使用
public class ConsumerTest {
public static void main(String[] args) {
final BmwFactory bmwFactory = new BmwFactory();
bmwFactory.createCar();
bmwFactory.pricing();
}
}

总结:
无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。

评论