影落离风

The shadow falls away from the wind

0%

巧用模板模式和工厂模式简化开发工作

前言

在业务中经常会遇到根据switch或if判断来走不同的流程。

如果这些流程中有相似性,我们可以将它封装为接口,然后构建不同的类去调用。

过程

举个例子:比如我们大家可能都是人,在这个喧嚣而又复杂的社会中扮演着不同的角色。有的人是老板、有的是公务员,但大多数都是普通人。管你是什么人,你都要吃饭和玩,这是所有生物的本能呢。

所以就有了一个动物本能的接口,所有动物都具有该功能

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 动物本能
*
* @author MinWeikai
* @date 2021/6/5 11:29
*/
public interface AnimalInstinct {

void play();

void eat();
}

而我们人类的生活就是不断的思考、体会人生和做我们开心的事

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* 人也具有动物的本能
*
* @author MinWeikai
* @date 2021/6/5 11:30
*/
public abstract class AbstractPerson implements AnimalInstinct {

protected String name = "所有人";

protected abstract void think();

void life(String name){
this.name = name;
this.think();
this.happy();
}

void happy() {
this.eat();
this.play();
}
}

社会中人类扮演的每种角色都具有相同的功能,但具体实现又各不相同

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* 具体的公务员
*
* @author MinWeikai
* @date 2021/6/5 11:33
*/
public class CivilServant extends AbstractPerson {
@Override
protected void think() {
System.out.println(name +"一切为了人民!");
}

@Override
public void play() {
System.out.println(name +"玩游戏");
}

@Override
public void eat() {
System.out.println(name +"吃皇粮");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* 具体的普通人
*
* @author MinWeikai
* @date 2021/6/5 11:33
*/
public class AveragePerson extends AbstractPerson {
@Override
protected void think() {
System.out.println(name +"今天要搬砖还是躺平?");
}

@Override
public void play() {
System.out.println(name +"玩游戏");
}

@Override
public void eat() {
System.out.println(name +"吃烧烤");
}
}

不论是什么角色,在社会这个大工厂中,大众对他们就是刻板印象

你是averagePerson=普通人,那就是属于AveragePerson角色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 人类角色工厂
*
* @author MinWeikai
* @date 2021/6/5 12:12
*/
public class AbstractPersonFactory {

static Map<String, AbstractPerson> personMap = new HashMap<>();

static {
personMap.put("averagePerson", new AveragePerson());
personMap.put("civilServant", new CivilServant());
}

public static AbstractPerson getPerson(String character) throws Exception {
return Optional.ofNullable(personMap.get(character)).orElseThrow(Exception::new);
}
}

人们看到你这个角色,就知道你是什么人

1
2
3
4
5
6
7
8
9
10
11
12
/**
* @author MinWeikai
* @date 2021/6/5 12:17
*/
public class AbstractPersonFactoryTest {

public static void main(String[] args) throws Exception {
AbstractPerson averagePerson = AbstractPersonFactory.getPerson("averagePerson");
averagePerson.life("张伟");

}
}

大众认知中该角色的张伟

1
2
3
4
5
6
7
Connected to the target VM, address: '127.0.0.1:56191', transport: 'socket'
张伟今天要搬砖还是躺平?
张伟吃烧烤
张伟玩游戏
Disconnected from the target VM, address: '127.0.0.1:56191', transport: 'socket'

Process finished with exit code 0

总结

由上述代码可以看出只要继承了该抽象类AbstractPerson,都要实现think()、play()、eat()方法,这也是所有人的生活,人类的悲欢都是相通的。

具有相同属性和行为,可用模板代码实现。

未来又有新的角色诞生,他还是要继承AbstractPerson,然后在社会这个工厂里注册他的角色。

在动物本能类中AnimalInstinct具有相同功能都应实现该类,如抽象猪、抽象狗等。

使用以上模式可以将类似类、类似功能代码不断地封装。易于维护,使用者无需关心方法的调用,只需继承对应的抽象类、关心自己角色的实现即可。

代码

上述代码路径