0%

设计模式 | 工厂模式

这篇博客将详细的介绍一下工厂模式。


参考资料


模式的秘密——工厂模式
工厂模式


基础知识


  • 实例化对象,用工厂方法代替 new
  • 工厂模式包括
    • 工厂方法模式
    • 抽象工厂模式
      • 抽象工厂模式是工厂方法模式的扩展

简单工厂模式


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
package com.redisc;

import lombok.extern.slf4j.Slf4j;

abstract class Car {
abstract void run();
}

class BMW extends Car {
@Override
void run() {
System.out.println("BMW");
}
}

class BC extends Car {
@Override
void run() {
System.out.println("BC");
}
}

class CarFactory {
public Car getCar(String carName) {
Car car = null;
if (carName.equals("BC")) {
car = new BC();
} else if (carName.equals("BMW")) {
car = new BMW();
}
return car;
}
}

@Slf4j(topic = "c.Test")
public class Run {
public static void main(String[] args){
new CarFactory().getCar("BC").run();
}

}

通过一个工厂方法,传入参数来获取不同的 car 对象。


工厂方法模式


简单工厂模式,有一个不好的地方,假如,又来了一个新的 car,你必须还要去修改 CarFactory 方法。

所以,可以通过给每一个 car 都创建一个工厂。

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
package com.redisc;

import lombok.extern.slf4j.Slf4j;

abstract class Car {
abstract void run();
}

interface CarFactory<T> {
T getCar();
}

class BMW extends Car {
@Override
void run() {
System.out.println("BMW");
}
}

class BMWFactroy implements CarFactory<BMW> {
@Override
public BMW getCar() {
return new BMW();
}
}

class BC extends Car {
@Override
void run() {
System.out.println("BC");
}
}

class BCFactroy implements CarFactory<BC> {
@Override
public BC getCar() {
return new BC();
}
}

@Slf4j(topic = "c.Test")
public class Run {
public static void main(String[] args) {
new BCFactroy().getCar().run();
}

}

看到上面的代码,你可能会产生以下疑问

  • 每个 car 都创建一个工厂,那不是冗余了吗
  • 这和直接 new car 有什么区别

冗余

代码确实是多了,但是,却解耦了。之前的简单工厂,每创建一个 car 都需要改变工厂方法。如果,工厂方法中用的是非常复杂的逻辑,后面每一个改动对维护都是非常致命的。

直接 new

不直接 new 的好处,就是,工厂方法隔离了具体类的实现,使得用户不需要关心具体是什么车。比如,BWM 下面又分为有天窗没天窗的,可以通过工厂方法进行合适的拼装。


抽象工厂模式


这个直接看 抽象工厂模式

其本质就是在工厂模式的情况下,又加了一层超级工厂。有的工厂管理手机,有的管理路由器,而抽象工厂是管理手机工厂和路由器工厂的。

请我喝杯咖啡吧~