前提假设:现在有一个新开的奶茶店Store,只能制作一种奶茶。

image-20201203104847731

1
2
3
4
5
6
//MilkTea.java
public class MilkTea{
public void prepare(){
System.out.println("制作奶茶");
}
}
1
2
3
4
5
6
7
8
//Store.java
public class Store {
public MilkTea createMilkTea(){
MilkTea milkTea = new MilkTea();
milkTea.prepare();
return milkTea;
}
}

奶茶店的生意越来越好,老板决定推出几种新口味的奶茶

MilkTea类设置为抽象类

1
2
3
4
5
//MilkTea.java
public abstract class MilkTea {
public void prepare() {
}
}

创建LemonMilkTeaAppleMilkTea两个类

1
2
3
4
5
6
7
//LemonMilkTea.java
public class LemonMilkTea extends MilkTea{
@Override
public void prepare() {
System.out.println("制作柠檬奶茶");
}
}
1
2
3
4
5
6
7
//AppleMilkTea.java
public class AppleMilkTea extends MilkTea{
@Override
public void prepare() {
System.out.println("制作苹果奶茶");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Store.java
public class Store {
public MilkTea createMilkTea(String type) {
MilkTea milkTea = null;
if (type.equals("lemon")) {
milkTea = new LemonMilkTea();
} else if (type.equals("apple")) {
milkTea = new AppleMilkTea();
}
//暂不考虑milkTea==null的情况
milkTea.prepare();
return milkTea;
}
}

现在复杂的场景来了,随着业务的发展,有的口味不受用户喜欢,销量惨淡,老板要将这些口味的奶茶砍掉,并且重新创造新的口味,于是在原来的createMilkTea方法中需要不断的重复添加和删除if-else语句,并且可能在Store的业务中不仅仅只有createNilkTea一个方法,其他的方法也可能会包含上述的大量if-else添加删除操作,所以需要将创造milkTea的代码抽离出来,用另外一个对象来进行操控,这个对象就可以称之为“工厂”。

创建工厂SimpleFactory.java

1
2
3
4
5
6
7
8
9
10
11
public class SimpleFactory {
public MilkTea createMilkTea(String type) {
MilkTea milkTea = null;
if (type.equals("lemon")) {
milkTea = new LemonMilkTea();
} else if (type.equals("apple")) {
milkTea = new AppleMilkTea();
}
return milkTea;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Store.java
public class Store {
SimpleFactory factory;

public Store(SimpleFactory factory) {
this.factory = factory;
}

public MilkTea createMilkTea(String type) {
MilkTea milkTea = factory.createMilkTea(type);
//暂不考虑milkTea==null的情况
milkTea.prepare();
return milkTea;
}
}

简单工厂其实不是一个设计模式,反而像是一种编程习惯。

参考书籍:Head First设计模式第四章“烘烤OO的精华:工厂模式”

image-20201107205416084