工厂模式分为如下三种:
1. 引例
假设现有需求:实现一个用户在奶茶店订购奶茶的项目。用户输入奶茶的品种,奶茶店输出该奶茶的制作信息,完成订购。
- 1)奶茶的品种很多(比如:PearlMilkTea、CoconutMilkTea等)
- 2)奶茶的制作有prepare,produce,packaging
传统的实现方式:
- 构建奶茶的一个抽象类,让各个种类的奶茶继承,并实现自己独有的方法。
- 用户输入奶茶名,输出奶茶的制作信息
public class OrderTea {
public OrderTea(){
Tea tea = null;
String orderType;
do {
orderType = getType();
if (orderType.equals("PearlMilkTea")){
tea = new PearlMilkTea("PearlMilkTea");
}else if (orderType.equals("CoconutMilkTea")){
tea = new CoconutMilkTea("CoconutMilkTea");
}else {
break;
}
tea.prepare();
tea.produce();
tea.packaging();
}while (true);
}
private String getType() {
try {
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("输入想要订购的茶:");
String str = strin.readLine();
return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
输入想要订购的茶:
PearlMilkTea
PearlMilkTea: 正在准备PearlMilkTea的原材料
PearlMilkTea: 正在制作中
PearlMilkTea: 制作完毕,正在打包
输入想要订购的茶:
CoconutMilkTea
CoconutMilkTea: 正在准备CoconutMilkTea的原材料
CoconutMilkTea: 正在制作中
CoconutMilkTea: 制作完毕,正在打包
- 优点:容易理解,简单易操作。
- 缺点:违反设计模式的OCP原则,即对扩展(提供方)开放,对修改(使用方)关闭。例如:当增加一个新的奶茶品种时,我们需要对下面的代码进行如下修改.
// 使用方
do {
orderType = getType();
if (orderType.equals("PearlMilkTea")){
tea = new PearlMilkTea("PearlMilkTea");
}else if (orderT