上午11点。易饿又常常不知道吃啥的小菜菌开始惆怅。
小菜菌:Kim,中午吃啥呀。
小Kim菌:午餐。
小菜菌:...
小Kim菌:菜菜,你已经是个成熟的程序媛了,要学会自己写代码解决问题。
于是,小菜菌噼里啪啦写了起来。
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("食谱搜索:");
while (true){
String meal = scanner.next();
String result = "";
switch (meal){
case "早餐":
result = "小笼包、烧麦、虾饺、艇仔粥、肠粉、牛腩粉...";
break;
case "午餐":
result = "菠萝饭、叉烧饭、海鲜炒饭、糖醋排骨、水东芥菜...";
break;
case "晚餐":
result = "板栗炖鸡汤、番茄炒蛋、可乐鸡翅...";
break;
default:
break;
}
System.out.println(result);
}
}
小Kim菌:使用没毛病。如果要加个宵夜呢?
小菜菌:简单啦,在switch加个宵夜分支。
早餐:劳资不同意,万一菜菜手抖把我修改成了「宵夜」呢?
小菜菌:好咯,那我把各种餐分开厨房(类),在main方法判断好分别创建对应厨房(类)的实例,这样加宵夜类或者改早餐类,是去到对应厨房(类)修改,对于各种餐来说是互不影响了。
午餐:菜菜呀,这么说main方法里面这块相当于客户端了,他只是个送餐小哥,既要接收单子,还要判断各张单子属于哪个厨房,分别去不同厨房取了,再送出去。
晚餐:送餐小哥太辛苦了,何不把判断厨房、进出厨房的工作交给厨房工厂大大呢?
小菜菌:各位老板说得都对,让我想想...
最后小菜菌一顿操作,运用了「简单工厂模式」,可算把各位老板提的问题都解决了。
1、把各种餐分开厨房。
首先创建一个新的厨房类 MealSearch,作为所有厨房的父类。
public class MealSearch {
public String meal = "";
public String getResult(){
meal = "";
return meal;
}
}
然后分别创建各种餐类厨房,对的,他们都是MealSearch的儿子,继承了爸爸的餐名属性(meal),和取餐方法getResult()。
比如早餐类:
public class Breakfast extends MealSearch {
public String getResult(){
meal = "小笼包、烧麦、虾饺、艇仔粥、肠粉、牛腩粉...";
return meal;
}
}
2、把各个餐类的取餐方式交给厨房工厂大大。
public class MealFactory{
public static MealSearch createMealSearch(String inputMeal){
MealSearch mealSearch = null;
switch (inputMeal){
case "早餐":
mealSearch = new Breakfast();
break;
case "午餐":
mealSearch = new Lunch();
break;
case "晚餐":
mealSearch = new Dinner();
break;
case "宵夜":
mealSearch = new Supper();
break;
default:
mealSearch = new MealSearch();
}
return mealSearch;
}
}
3、送餐小哥接单,向厨房工厂大大取餐,送餐。
import java.util.Scanner;
public class Meal {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("食谱搜索:");
String inputMeal = "";
MealSearch mealSearch = null;
String result = "";
while (true){
inputMeal = scanner.next();
mealSearch = MealFactory.createMealSearch(inputMeal);
result = mealSearch.getResult();
System.out.println(result);
}
}
}
最后我们总结一下「简单工厂模式」的优缺点。
优点:
1、简单工厂模式提供了专门的工厂类用于创建对象,实现了责任的分割。(厨房工厂大大掌管各个厨房)
2、客户端只需要知道具体产品类对应的参数,而无须了解这些对象的创建、组织逻辑。(送餐小哥只要知道餐的名字,无须关心厨房是怎么搭建的)
3、当引入新的产品不需要修改客户端。(宵夜厨房的完美上线)
缺点:
1、工厂类集中了所有产品的创建逻辑,如果工厂出问题(厨房工厂大大跑路),所有客户端都会受牵连。
2、加个产品就要加个类。(宵夜厨房也要交租的)
另外举个栗子:JDK类库中的工具类--java.text.DateFormat,用于格式化本地时间。它也用了「简单工厂模式」呢。
public final static DateFormat getDateInstance();
public final static DateFormat getDateInstance(int style);
public final static DateFormat getDateInstance(int style,Locale
locale);