hooyantsing's Blog

P13 简单工厂

字数统计: 412阅读时长: 1 min
2020/11/08

Java设计模式-Mr.high

应用场景

适用于未来产品种类不会改变。

工厂设计模式三种方式

  1. 简单工厂
  2. 工厂方法
  3. 抽象工厂

简单工厂

优点:

  1. 把具体产品的类型,从客户端代码中解耦出来。

  2. 服务器端,如果修改了具体的产品的类名,客户端不知道。

符合“面向接口编程”的思想。

缺点:

  1. 客户端不得不死记硬背那些常量与具体产品的映射关系,比如1对应面条,2对应米饭。
  2. 如果具体产品特别多,则简单工厂就会变得十分臃肿。比如有100个具体产品,则需要在简单工厂的switch里写出100个case。
  3. 最重要的是,新的需求将不满足“开闭原则”。
工厂的初衷

由于产品类名可能会经常发生变化,通过加入factory这一层将其于上层隔离,而factory作为约定,很小概率会改变。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
classDiagram
class Food{
<<interface>>
+eat() void
}
class Noodle{
+eat() void
}
class Rice{
+eat() void
}
class FoodFactory{
+getFood()$ Food
}
Food <|.. Noodle
Food <|.. Rice
Food <.. FoodFactory
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 xyz.hooy.woniuxueyuan;

// 服务端
// 抽象产品
interface Food {
void eat();
}

// 具体产品
class Noodle implements Food{
@Override
public void eat() {
System.out.println("面条");
}
}
// 具体产品
class Rice implements Food{
@Override
public void eat() {
System.out.println("米饭");
}
}

// 简单工厂
class FoodFactory {
public static Food getFood(int n){
Food food = null;
switch (n){
case 1:
food = new Noodle();
break;
case 2:
food = new Rice();
break;
}
return food;
}
}

// ==========================================
// 客户端
public class AppTest {
public static void main(String[] args) {
Food food = FoodFactory.getFood(1);
food.eat();
}
}
CATALOG
  1. 1. 应用场景
  2. 2. 工厂设计模式三种方式
  3. 3. 简单工厂
    1. 3.1. 工厂的初衷