工厂模式

1.定义

该模式用来封装和管理类的创建,终极目的是为了解耦,实现创建者和调用者的分离。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,而是通过使用一个共同的接口来指向新创建的对象。这个接口可以留给子类自行选择用这个工厂生产什么类型的产品。

工厂模式的本质就是对获取对象过程的抽象。

2.适用范围

很多场景中都能够适用,比如spring中的beanFactory工厂。能生产多个具有一定相似度对象的都可以由工厂模式来进行处理。

3.实例

3.1 简单工厂模式

结构图

img

这是一个学生选课的系统,很符合工厂模式的供给。老师不可能自己凭空创造课程,而应该是学校教务创建好课程之后让老师去选择自己想要传授的课程。而工厂模式能给我们提供这样的选择,他通过ClassFactory对外暴露了创建课程的接口, 但具体的创建流程是完全封装起来的。能够保证安全性和实现解耦合。

其中在这个简单工厂模式中,我们需要实现三个内容:

  • 工厂类(需要对外暴露生产产品的方法以及需要提供的参数,以及原材料提供,但是无需暴露生产逻辑)
  • 抽象产品类
  • 具体产品类

工厂类

1
2
3
4
5
6
7
8
9
10
11
12
13
public class ClassFactory {
public Class createClass(String className) {
switch (className) {
case "computerNet":
return new ComputerNet();
case "DataStruct":
return new DataStruct();
case "OperatorSystem":
return new OperatorSystem();
}
return null;
}
}

我们会发现,这里还有很多的条件分支语句,这就是简单工厂模式的一个缺点,扩展性不强。后续需要工厂生产新产品的时候需要对源代码的逻辑产生修改,不符合开闭原则。我们可以用策略模式对其进行优化。

抽象课程类

1
2
3
4
5
6
7
8
9
public abstract class Class {

public abstract String getName();

public abstract String getTeacher();

public abstract int getScore();

}

具体课程类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class OperatorSystem extends Class{
@Override
public String getName() {
return "操作系统";
}

@Override
public String getTeacher() {
return "我嫩爹";
}

@Override
public int getScore() {
return 4;
}
}

3.2 工厂方法模式

定义一个抽象的接口,让子类决定实例化哪个类。

结构图

img

定义一个抽象方法工厂类,每一个具体的课程对象都有具体的工厂类进行创建,具体的实现交由子类进行处理,****工厂方法将对象的实例化推迟到了子类,便于后期的维护和扩展,之后如果需要新增课程的话,只需要再建立一个新的工厂对象去继承抽象工厂即可,对原来的代码没有影响。

3.3 抽象工厂模式

在抽象工厂类中新增创建该产品的抽象方法,然后在具体工厂子类中实现它即可。相当于工厂模式的一种拓展。