1、简单/静态工厂模式概述

  1. 简单工厂模式使属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式


  1. 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)


  1. 在软件开发中,当我们会用到大量的创建某种,某类或者某批对象时,就会使用到工厂模式


  1. 定义一个简单工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常是具有共同的父亲


  1. 在简单工厂模式中,创建实例的方法通常为静态方法,因此简单工厂模式又被称为静态工厂模式


2、简单工厂模式的优点:

  • 工厂类包含了必要的逻辑判断,可以决定在什么情况下创建哪个类的实例,客户端可以免除直接创建产品对象的职责


  • 客户端无需知道所创建的产品的类名,只需知道参数即可。


  • 也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类


3、缺点

  • 工厂类集中了所有的产品创建逻辑,职责过重,一旦异常,整个系统受到影响


  • 使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度


  • 系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂


  • 简单工厂模式使用了static工厂方法,造成工厂角色无法形成基于继承的等级结构。


4、简单工厂模式的使用场景:

  • 工厂类负责创建对的对象比较少,因为不会造成工厂方法中的业务逻辑过于复杂


  • 客户端只知道传入工厂类的参数,对如何创建对象不关心


5、代码实现

  1. class Demo{
  2. public static void main(String[] args) {
  3. //调用工厂里的静态方法 创建对象
  4. Pizza hj = PizzaFactory.getPizza("胡椒");
  5. hj.getReady();
  6. }
  7. }
  8. public abstract class Pizza {
  9. //父类中的抽象方法
  10. public abstract void getReady();
  11. }
  12. class APizza extends Pizza{
  13. @Override
  14. public void getReady() {
  15. System.out.println("胡椒披萨正在制作");
  16. }
  17. }
  18. class BPizza extends Pizza{
  19. @Override
  20. public void getReady() {
  21. System.out.println("番茄披萨正在制作");
  22. }
  23. }
  24. //Pizza工厂类
  25. class PizzaFactory{
  26. //静态方法 ,根据传入的值进行判断创建对象
  27. public static Pizza getPizza(String name){
  28. Pizza pizza = null;
  29. if ("胡椒".equals(name)){
  30. pizza = new APizza();
  31. }else if("番茄".equals(name)){
  32. pizza = new BPizza();
  33. }
  34. return pizza;
  35. }
  36. }

6、简单工厂练习题

使用简单工厂模式设计一个可以创建不同几何图形(Shape),如Circle,Rectangle,Triangle等绘图工具类,每个几何图形均具有绘制Draw()和擦除Erase()两个方法

  1. package com.yixuexi;
  2. import java.util.Scanner;
  3. /**
  4. * 2020/10/15 22:06
  5. */
  6. public class ShapeDemo {
  7. public static void main(String[] args) {
  8. boolean loop = true;
  9. while (loop){
  10. System.out.println("请输入要打印的图形:");
  11. Scanner scanner = new Scanner(System.in);
  12. String next = scanner.next();
  13. switch (next){
  14. case "正方形":
  15. Shape shape1 = ShapeFactory.getShape(next);
  16. shape1.draw();
  17. shape1.erase();
  18. break;
  19. case "圆形":
  20. Shape shape2 = ShapeFactory.getShape(next);
  21. shape2.draw();
  22. shape2.erase();
  23. break;
  24. case "三角形":
  25. Shape shape3 = ShapeFactory.getShape(next);
  26. shape3.draw();
  27. shape3.erase();
  28. break;
  29. default:
  30. System.out.println("没有该图形");
  31. loop = false;
  32. }
  33. }
  34. }
  35. }
  36. interface Shape{
  37. void draw();
  38. void erase();
  39. }
  40. //圆形
  41. class Circle implements Shape{
  42. @Override
  43. public void draw() {
  44. System.out.println("正在画圆形");
  45. }
  46. @Override
  47. public void erase() {
  48. System.out.println("正在擦除圆形");
  49. }
  50. }
  51. //正方形
  52. class Rectangle implements Shape{
  53. @Override
  54. public void draw() {
  55. System.out.println("正在画正方形");
  56. }
  57. @Override
  58. public void erase() {
  59. System.out.println("正在擦除正方形");
  60. }
  61. }
  62. //三角形
  63. class Triangle implements Shape{
  64. @Override
  65. public void draw() {
  66. System.out.println("正在画三角形");
  67. }
  68. @Override
  69. public void erase() {
  70. System.out.println("正在擦除三角形");
  71. }
  72. }
  73. // 简单图形工厂
  74. class ShapeFactory{
  75. public static Shape getShape(String type){
  76. Shape shape = null;
  77. if ("三角形".equals(type)){
  78. shape = new Triangle();
  79. }else if("正方形".equals(type)){
  80. shape = new Rectangle();
  81. }else if("圆形".equals(type)){
  82. shape = new Circle();
  83. }
  84. return shape;
  85. }
  86. }