前言

本博客主要介绍简单工厂模式(Simple Factory),简单工厂模式是创建型模式的一员,也是我们平时coding用到的比较多的一个模式了。

思考题

首先,让我们思考以下的需求:

博主,突然很想吃宫保鸡丁和西红柿炒鸡蛋,那么博主的需求怎样才能得到满足呢?

当我们没有修炼过 简单工厂模式 这本秘籍,我会自己动手做:

首先我会上百度搜索到制作那两个菜的方法:

KungPaoChicken.java:

public class KungPaoChicken {
private String name = "宫保鸡丁"; @Override
public String toString() {
return name;
}
}

TomatoEgg.java

public class TomatoEgg {
private String name = "西红柿炒鸡蛋"; @Override
public String toString() {
return name;
}
}

然后我开始制作这两个菜:

Custom.java

public class Custom {
public static void main(String... args) {
KungPaoChicken kungPaoChicken = new KungPaoChicken();
TomatoEgg tomatoEgg = new TomatoEgg(); System.out.println(kungPaoChicken);
System.out.println(tomatoEgg);
}
}

所有的东西都是我们自己去操作。

下面我们给出了上面的代码的uml类图:

简单工厂模式(Simple Factory)

定义:提供一个创建对象实例的功能,而无需用户自己去创建,无需关注具体实现。

类图:

上面的类途中一共有三个角色:

  • 抽象产品(Product):负责抽象出一类产品的行为,所有的产品都需要实现这个行为,使工厂可以使用这个类来引用子类的实例。
  • 工厂(Factory):负责实例化产品,并返回父类的引用给用户。将用户和产品的具体实现分离。
  • 具体产品(Concrete):产品的具体实现,不同的产品有不同的实现,但是他们都要继承抽象产品。

重构思考

通过简单工厂的学习,博主突然想去开一个饭店,这样顾客只需要付钱并且点菜就可以吃到想吃的菜了,想想是不是很方便。

首先,我们需要一个 抽象产品 :

Food.java:

public interface Food {
void eat();
}

然后, 具体的产品 :

KungPaoChicken.java:

public class KungPaoChicken implements Food {
@Override
public void eat() {
System.out.println("吃宫保鸡丁");
}
}

TomatoEgg.java:

public class TomatoEgg implements Food {
@Override
public void eat() {
System.out.println("吃西红柿");
}
}

最后,我们创建工厂:

MyHotal.java:

public class MyHotal {
public Food createFood(String foodName) {
switch(foodName) {
case "KungPaoChicken":
return new KungPaoChicken();
case "TomatoEgg":
return new TomatoEgg();
default:
return null;
}
}
}

那么我们来测试一下:

Custom.java:

public class Custom {
public static void main(String ...args) {
MyHotal myHotal = new MyHotal();
Food kungPaoChicken = myHotal.createFood("KungPaoChicken");
Food tomatoEgg = myHotal.createFood("TomatoEgg"); kungPaoChicken.eat();
tomatoEgg.eat();
}
}

最新文章

  1. APP切图标记PS的外挂神器-Assistor PS(转)
  2. js直接打印pdf文件内容
  3. android内存优化
  4. linux下系统对于sigsegv错误时的处理
  5. 跟着百度学PHP[4]OOP面对对象编程-15-魔术方法__call方法
  6. extjs 一些杂碎的技术问题
  7. Ubuntu中开启MySQL远程访问功能,并将另一个数据库服务器中的数据迁移到新的服务器中
  8. mysql事务,START TRANSACTION, COMMIT和ROLLBACK,SET AUTOCOMMIT语法
  9. (旧)子数涵数·C语言——指针
  10. 理解tornado
  11. KEYUSE
  12. Qt+gsoap调用WebService
  13. 【学习笔记】锋利的jQuery(三)事件和动画
  14. ural 1698. Square Country 5(记忆化搜索)
  15. bootstrap禁用点击空白处关闭模态框
  16. Excel的列编号 例如:A对应1,Z对应26,AA对应27,AZ对应52的JavaScript怎么写?
  17. Java关于数字工具类~持续汇总~
  18. Docker实践之01-入门介绍
  19. Docker 错误 docker: invalid reference format. 的解决
  20. 剑指offer7~10题

热门文章

  1. 洛谷 P3386 二分图匹配 题解
  2. Python 入门之 内置模块 -- re模块
  3. sql server 函数详解(2)数学函数
  4. 关于hstack和Svstack
  5. webpack4导入jQuery的新方案
  6. PHP出现502解决方案
  7. 阅读脚本控制pwm代码
  8. threading.local作用及原理
  9. 牛顿迭代法——C语言
  10. Shiro(二)