Java课堂|餐饮的本质(设计模式之工厂模式)

发布时间 2023-05-31 11:16:04作者: 可爱的小锋

前言

本文主要讲述工厂模式,文中使用通俗易懂的案例,使你更好的学习本章知识点并理解原理,做到有道无术。

一.什么是工厂模式

工厂模式是23种设计模式中创建型模式的一种,它是一个最简单的对象创建管理方式,根据调用方传递的类型来创建对象并返回。封装了对象创建的过程,降低了程序模块之间的耦合度。

二.生活中的工厂模式

1.沙县小吃

江帅记得沙县有炒饭、炒粉、云吞、馄饨、蒸饺、汤等各种各样的餐品,而你在沙县只需要告诉老板你想要什么并付款,老板会制作好相关的食物给到你,你不需要了解食物到底是怎么样制作出来的,只需要传递需求就能获取想要的东西,这就跟设计模式的工厂模式很相似。

image.png

2.金拱门(麦当劳)与开封菜(KFC)

麦当劳和肯德基是著名的快餐店,有诸多食品,比如汉堡。汉堡这个食物是由他们提供给我们的,而我们只需要告诉餐厅我们需要的是哪个汉堡并付钱就可以了,具体他们是怎么完成这个汉堡的,就不需要我们去考虑了,而这就像设计模式的工厂模式一样。

image.png

3.茶餐厅

这些茶餐厅也跟其他餐饮一样,你只需要告诉店员你想要的餐品并付款,后厨就能跟你的需求制作出你点的美食,你也无需关注它如何制作出来的,这也就跟设计模式的工厂模式很相似。

请添加图片描述

三.工厂模式的实现

接下来江帅以一家茶餐厅来举例,用工厂模式来实现。先创建一个抽象产品类食物类和两个具体产品类奶茶类和三明治类

package com.qianfeng.ran
/\*

*   @author:江帅
*
*   抽象产品
*        定义一个所有食物的抽象父类:食物类

\*/
public abstract class Food{
//定义一个打印当前食物名的方法
void pirntName();
}

/\*

*   具体产品
*        创建一个继承食物类的子类:奶茶类

\*/
class MikeTea extends Food{
//重写父类的抽象方法
public void printName(){
System.out.println("奶茶");
}
}

/\*

*   具体产品
*        创建一个继承食物类的子类:三明治类

\*/
class Sandwich extends Food{
//重写父类的抽象方法
public void printName(){
System.out.println("三明治");
}
}

再创建一个具体工厂,类似茶餐厅

package com.qianfeng.ran
/*
 * @author:江帅
 *	
 * 	具体工厂
 *		定义一个工厂类:茶餐厅
 */
public class TeaRestaurantFactory{
	//定义一个根据需求返回具体食物对象的静态方法,类似厨房
    public static Food kitchen(String type){
        //判断传递进来的需求是否为 null ,为 null 则返回 null 对象
    	if(type == null){
            return null;
        }
        //根据需求返回对应的食物对象
        if("1".equals(type)){ //假设传递"1"为需要奶茶
            //返回奶茶对象
            return new MikeTea();
        }else if("2".equals(type)){//假设传递"2"为需要三明治
            //返回三明治对象
            return new Sandwich();
        }
    }
}

最后通过工厂类(茶餐厅)调用对应的静态方法(厨房)并传递需求(字符串)获取对象(食物)

package com.qianfeng.ran
/*
 * @author:江帅
 *	
 * 	客户端
 */
public class Demo{
    public static void main(String[] args){
        //调用工厂类的静态方法,并传递字符串"1"获取奶茶对象
        Food mikeTea = TeaRestaurantFactory.kitchen("1");
        //执行结果:
        //"奶茶"
        System.out.println(mikeTea.printName());
        //调用工厂类的静态方法,并传递字符串"2"获取三明治对象
        Food sandwich = TeaRestaurantFactory.kitchen("1");
        //执行结果:
        //"三明治"
        System.out.println(sandwich.printName());
    }
}

四.配套视频

如果你不习惯阅读技术文章,或是对文中的技术概念不能很好地理解,可以来看看江帅帮你筛选出的视频教程。

与本文配套的Java学习视频,戳我直达

五.总结

在工厂模式中,咱们只需要传递需求给工厂类的方法,就能获取我们所需要的对象,从而降低类与类之间的耦合度,我们也无需了解类的创建过程和对象的创建过程,只需要关注对象的使用即可。

但是工厂模式有个弊端,就是每添加多一个具体产品类,则需要改动工厂类里的方法,这就违背了设计模式中的开闭原则。就像茶餐厅里多一个菜品时,我们就需要更新菜单。

下一章,我们将带大家学习企业的运行模式(设计模式之抽象工厂模式)。