今天吃什么--简单工厂模式

上午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);
 

 

                                                             

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值