设计模式(10) -- 工厂设计模式(简单工厂,工厂方法,抽象工厂模式)

向右看齐 2023-06-13 09:45 157阅读 0赞

文章目录

  • 简单工厂模式
    • 需求1:
    • 传统实现
      • 优缺点:
    • 简单工厂方式实现
      • 基本介绍
  • 工厂方法模式
    • 介绍
    • 需求2:
    • 实现
  • 抽象工厂模式
    • 介绍
    • 需求
  • 工厂模式在JDK Calendar应用的源码 分析
  • 工厂模式小结

简单工厂模式

需求1:

看一个披萨的项目:要便于披萨种类的扩展,要便于维护
1)披萨的种类很多,比如GreekPizz 、 CheesePizz 等
2)披萨的制作有 prepare bake, cut, box
3)完成披萨店订购功能。

传统实现

在这里插入图片描述
Pizza 类

  1. //将Pizza 类做成抽象
  2. public abstract class Pizza {
  3. protected String name; //名字
  4. //准备原材料, 不同的披萨不一样,因此,我们做成抽象方法
  5. public abstract void prepare();
  6. public void bake() {
  7. System.out.println(name + " baking;");
  8. }
  9. public void cut() {
  10. System.out.println(name + " cutting;");
  11. }
  12. //打包
  13. public void box() {
  14. System.out.println(name + " boxing;");
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. }

CheesePizza类

  1. public class CheesePizza extends Pizza {
  2. @Override
  3. public void prepare() {
  4. // TODO Auto-generated method stub
  5. System.out.println(" 给制作奶酪披萨 准备原材料 ");
  6. }
  7. }

GreekPizza

  1. public class GreekPizza extends Pizza {
  2. @Override
  3. public void prepare() {
  4. // TODO Auto-generated method stub
  5. System.out.println(" 给希腊披萨 准备原材料 ");
  6. }
  7. }

PepperPizza

  1. public class PepperPizza extends Pizza {
  2. @Override
  3. public void prepare() {
  4. // TODO Auto-generated method stub
  5. System.out.println(" 给胡椒披萨准备原材料 ");
  6. }
  7. }

OrderPizza 订购pizza

  1. public class OrderPizza {
  2. // 构造器
  3. public OrderPizza() {
  4. Pizza pizza = null;
  5. String orderType; // 订购披萨的类型
  6. do {
  7. orderType = getType();
  8. if (orderType.equals("greek")) {
  9. pizza = new GreekPizza();
  10. pizza.setName(" 希腊披萨 ");
  11. } else if (orderType.equals("cheese")) {
  12. pizza = new CheesePizza();
  13. pizza.setName(" 奶酪披萨 ");
  14. } else if (orderType.equals("pepper")) {
  15. pizza = new PepperPizza();
  16. pizza.setName("胡椒披萨");
  17. } else {
  18. break;
  19. }
  20. //输出pizza 制作过程
  21. pizza.prepare();
  22. pizza.bake();
  23. pizza.cut();
  24. pizza.box();
  25. } while (true);
  26. }
  27. // 写一个方法,可以获取客户希望订购的披萨种类
  28. private String getType() {
  29. try {
  30. BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
  31. System.out.println("input pizza 种类:");
  32. String str = strin.readLine();
  33. return str;
  34. } catch (IOException e) {
  35. e.printStackTrace();
  36. return "";
  37. }
  38. }
  39. }

测试类:PizzaStore

  1. //相当于一个客户端,发出订购
  2. public class PizzaStore {
  3. public static void main(String[] args) {
  4. new OrderPizza();
  5. }
  6. }

运行结果:
在这里插入图片描述

优缺点:

在这里插入图片描述

简单工厂方式实现

基本介绍

在这里插入图片描述
在这里插入图片描述
类:
在这里插入图片描述
其中: 这下面的4个类代码不变。
在这里插入图片描述
SimpleFactory

  1. //简单工厂类
  2. public class SimpleFactory {
  3. //更加orderType 返回对应的Pizza 对象
  4. public Pizza createPizza(String orderType) {
  5. Pizza pizza = null;
  6. System.out.println("使用简单工厂模式");
  7. if (orderType.equals("greek")) {
  8. pizza = new GreekPizza();
  9. pizza.setName(" 希腊披萨 ");
  10. } else if (orderType.equals("cheese")) {
  11. pizza = new CheesePizza();
  12. pizza.setName(" 奶酪披萨 ");
  13. } else if (orderType.equals("pepper")) {
  14. pizza = new PepperPizza();
  15. pizza.setName("胡椒披萨");
  16. }
  17. return pizza;
  18. }
  19. //简单工厂模式 也叫 静态工厂模式
  20. public static Pizza createPizza2(String orderType) {
  21. Pizza pizza = null;
  22. System.out.println("使用简单工厂模式2");
  23. if (orderType.equals("greek")) {
  24. pizza = new GreekPizza();
  25. pizza.setName(" 希腊披萨 ");
  26. } else if (orderType.equals("cheese")) {
  27. pizza = new CheesePizza();
  28. pizza.setName(" 奶酪披萨 ");
  29. } else if (orderType.equals("pepper")) {
  30. pizza = new PepperPizza();
  31. pizza.setName("胡椒披萨");
  32. }
  33. return pizza;
  34. }
  35. }

OrderPizza

  1. public class OrderPizza {
  2. // 构造器
  3. // public OrderPizza() {
  4. // Pizza pizza = null;
  5. // String orderType; // 订购披萨的类型
  6. // do {
  7. // orderType = getType();
  8. // if (orderType.equals("greek")) {
  9. // pizza = new GreekPizza();
  10. // pizza.setName(" 希腊披萨 ");
  11. // } else if (orderType.equals("cheese")) {
  12. // pizza = new CheesePizza();
  13. // pizza.setName(" 奶酪披萨 ");
  14. // } else if (orderType.equals("pepper")) {
  15. // pizza = new PepperPizza();
  16. // pizza.setName("胡椒披萨");
  17. // } else {
  18. // break;
  19. // }
  20. // //输出pizza 制作过程
  21. // pizza.prepare();
  22. // pizza.bake();
  23. // pizza.cut();
  24. // pizza.box();
  25. //
  26. // } while (true);
  27. // }
  28. //定义一个简单工厂对象
  29. SimpleFactory simpleFactory;
  30. Pizza pizza = null;
  31. //构造器
  32. public OrderPizza(SimpleFactory simpleFactory) {
  33. setFactory(simpleFactory);
  34. }
  35. public void setFactory(SimpleFactory simpleFactory) {
  36. String orderType = ""; //用户输入的
  37. this.simpleFactory = simpleFactory; //设置简单工厂对象
  38. do {
  39. orderType = getType();
  40. pizza = this.simpleFactory.createPizza(orderType);
  41. //输出pizza
  42. if(pizza != null) { //订购成功
  43. pizza.prepare();
  44. pizza.bake();
  45. pizza.cut();
  46. pizza.box();
  47. } else {
  48. System.out.println(" 订购披萨失败 ");
  49. break;
  50. }
  51. }while(true);
  52. }
  53. // 写一个方法,可以获取客户希望订购的披萨种类
  54. private String getType() {
  55. try {
  56. BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
  57. System.out.println("input pizza 种类:");
  58. String str = strin.readLine();
  59. return str;
  60. } catch (IOException e) {
  61. e.printStackTrace();
  62. return "";
  63. }
  64. }
  65. }

OrderPizza2

  1. public class OrderPizza2 {
  2. Pizza pizza = null;
  3. String orderType = "";
  4. // 构造器
  5. public OrderPizza2() {
  6. do {
  7. orderType = getType();
  8. pizza = SimpleFactory.createPizza2(orderType);
  9. // 输出pizza
  10. if (pizza != null) { // 订购成功
  11. pizza.prepare();
  12. pizza.bake();
  13. pizza.cut();
  14. pizza.box();
  15. } else {
  16. System.out.println(" 订购披萨失败 ");
  17. break;
  18. }
  19. } while (true);
  20. }
  21. // 写一个方法,可以获取客户希望订购的披萨种类
  22. private String getType() {
  23. try {
  24. BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
  25. System.out.println("input pizza 种类:");
  26. String str = strin.readLine();
  27. return str;
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. return "";
  31. }
  32. }
  33. }

测试类 PizzaStore

  1. //相当于一个客户端,发出订购
  2. public class PizzaStore {
  3. public static void main(String[] args) {
  4. // TODO Auto-generated method stub
  5. //new OrderPizza();
  6. //使用简单工厂模式
  7. new OrderPizza(new SimpleFactory());
  8. //System.out.println("~~退出程序~~");
  9. //new OrderPizza2();
  10. }
  11. }

在这里插入图片描述

工厂方法模式

介绍

在这里插入图片描述

需求2:

在这里插入图片描述

实现

在这里插入图片描述
在这里插入图片描述
BJCheesePizza

  1. public class BJCheesePizza extends Pizza {
  2. @Override
  3. public void prepare() {
  4. // TODO Auto-generated method stub
  5. setName("北京的奶酪pizza");
  6. System.out.println(" 北京的奶酪pizza 准备原材料");
  7. }
  8. }

BJPepperPizza

  1. public class BJPepperPizza extends Pizza {
  2. @Override
  3. public void prepare() {
  4. // TODO Auto-generated method stub
  5. setName("北京的胡椒pizza");
  6. System.out.println(" 北京的胡椒pizza 准备原材料");
  7. }
  8. }

LDCheesePizza

  1. public class LDCheesePizza extends Pizza{
  2. @Override
  3. public void prepare() {
  4. // TODO Auto-generated method stub
  5. setName("伦敦的奶酪pizza");
  6. System.out.println(" 伦敦的奶酪pizza 准备原材料");
  7. }
  8. }

LDPepperPizza

  1. public class LDPepperPizza extends Pizza{
  2. @Override
  3. public void prepare() {
  4. // TODO Auto-generated method stub
  5. setName("伦敦的胡椒pizza");
  6. System.out.println(" 伦敦的胡椒pizza 准备原材料");
  7. }
  8. }

OrderPizza

  1. public abstract class OrderPizza {
  2. //定义一个抽象方法,createPizza , 让各个工厂子类自己实现
  3. abstract Pizza createPizza(String orderType);
  4. // 构造器
  5. public OrderPizza() {
  6. Pizza pizza = null;
  7. String orderType; // 订购披萨的类型
  8. do {
  9. orderType = getType();
  10. pizza = createPizza(orderType); //抽象方法,由工厂子类完成
  11. //输出pizza 制作过程
  12. pizza.prepare();
  13. pizza.bake();
  14. pizza.cut();
  15. pizza.box();
  16. } while (true);
  17. }
  18. // 写一个方法,可以获取客户希望订购的披萨种类
  19. private String getType() {
  20. try {
  21. BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
  22. System.out.println("input pizza 种类:");
  23. String str = strin.readLine();
  24. return str;
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. return "";
  28. }
  29. }
  30. }

BJOrderPizza

  1. public class BJOrderPizza extends OrderPizza {
  2. @Override
  3. Pizza createPizza(String orderType) {
  4. Pizza pizza = null;
  5. if(orderType.equals("cheese")) {
  6. pizza = new BJCheesePizza();
  7. } else if (orderType.equals("pepper")) {
  8. pizza = new BJPepperPizza();
  9. }
  10. // TODO Auto-generated method stub
  11. return pizza;
  12. }
  13. }

LDOrderPizza

  1. public class LDOrderPizza extends OrderPizza {
  2. @Override
  3. Pizza createPizza(String orderType) {
  4. Pizza pizza = null;
  5. if(orderType.equals("cheese")) {
  6. pizza = new LDCheesePizza();
  7. } else if (orderType.equals("pepper")) {
  8. pizza = new LDPepperPizza();
  9. }
  10. // TODO Auto-generated method stub
  11. return pizza;
  12. }
  13. }

测试类 PizzaStore

  1. public class PizzaStore {
  2. public static void main(String[] args) {
  3. String loc = "bj";
  4. if (loc.equals("bj")) {
  5. //创建北京口味的各种Pizza
  6. new BJOrderPizza();
  7. } else {
  8. //创建伦敦口味的各种Pizza
  9. new LDOrderPizza();
  10. }
  11. // TODO Auto-generated method stub
  12. }
  13. }

在这里插入图片描述

抽象工厂模式

介绍

在这里插入图片描述

需求

使用:抽象工厂模式来完成披萨项目(需求2)
在这里插入图片描述
在这里插入图片描述
AbsFactory

  1. //一个抽象工厂模式的抽象层(接口)
  2. public interface AbsFactory {
  3. //让下面的工厂子类来 具体实现
  4. public Pizza createPizza(String orderType);
  5. }

BJFactory

  1. //这是工厂子类
  2. public class BJFactory implements AbsFactory {
  3. @Override
  4. public Pizza createPizza(String orderType) {
  5. System.out.println("~使用的是抽象工厂模式~");
  6. // TODO Auto-generated method stub
  7. Pizza pizza = null;
  8. if(orderType.equals("cheese")) {
  9. pizza = new BJCheesePizza();
  10. } else if (orderType.equals("pepper")){
  11. pizza = new BJPepperPizza();
  12. }
  13. return pizza;
  14. }
  15. }

LDFactory

  1. public class LDFactory implements AbsFactory {
  2. @Override
  3. public Pizza createPizza(String orderType) {
  4. System.out.println("~使用的是抽象工厂模式~");
  5. Pizza pizza = null;
  6. if (orderType.equals("cheese")) {
  7. pizza = new LDCheesePizza();
  8. } else if (orderType.equals("pepper")) {
  9. pizza = new LDPepperPizza();
  10. }
  11. return pizza;
  12. }
  13. }

订购pizza类 OrderPizza

  1. public class OrderPizza {
  2. AbsFactory factory;
  3. // 构造器
  4. public OrderPizza(AbsFactory factory) {
  5. setFactory(factory);
  6. }
  7. private void setFactory(AbsFactory factory) {
  8. Pizza pizza = null;
  9. String orderType = ""; // 用户输入
  10. this.factory = factory;
  11. do {
  12. orderType = getType();
  13. // factory 可能是北京的工厂子类,也可能是伦敦的工厂子类
  14. pizza = factory.createPizza(orderType);
  15. if (pizza != null) { // 订购ok
  16. pizza.prepare();
  17. pizza.bake();
  18. pizza.cut();
  19. pizza.box();
  20. } else {
  21. System.out.println("订购失败");
  22. break;
  23. }
  24. } while (true);
  25. }
  26. // 写一个方法,可以获取客户希望订购的披萨种类
  27. private String getType() {
  28. try {
  29. BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
  30. System.out.println("input pizza 种类:");
  31. String str = strin.readLine();
  32. return str;
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. return "";
  36. }
  37. }
  38. }

测试类 PizzaStore

  1. public class PizzaStore {
  2. public static void main(String[] args) {
  3. // TODO Auto-generated method stub
  4. //new OrderPizza(new BJFactory());
  5. new OrderPizza(new LDFactory());
  6. }
  7. }

运行结果:
在这里插入图片描述

工厂模式在JDK Calendar应用的源码 分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

工厂模式小结

在这里插入图片描述


发表评论

表情:
评论列表 (有 0 条评论,157人围观)

还没有评论,来说两句吧...

相关阅读