• 简单工厂模式


    1. 场景:制作一个计算器的程序
      1. 过程式的开发
        1. 代码
          1. package staticFactoryMethod;
          2. import com.sun.xml.internal.ws.util.StringUtils;
          3. import java.util.Arrays;
          4. import java.util.Scanner;
          5. import java.util.regex.Pattern;
          6. public class First {
          7. public static void main(String[] args) {
          8. Scanner scanner = new Scanner(System.in);
          9. Pattern NUMBER_PATTERN = Pattern.compile("-?\\d+(\\.\\d+)?");
          10. String[] number = new String[2];
          11. do {
          12. System.out.print("请输入第一个数字:");
          13. number[0] = scanner.nextLine();
          14. }while (!NUMBER_PATTERN.matcher(number[0]).matches());
          15. String[] characterArr = {"+","-","*","/"};
          16. String character;
          17. do {
          18. System.out.print("请输入符号(+、-、*、/):");
          19. character = scanner.nextLine();
          20. }while (!Arrays.asList(characterArr).contains(character));
          21. do {
          22. System.out.print("请输入第二个数字:");
          23. number[1] = scanner.nextLine();
          24. }while (!NUMBER_PATTERN.matcher(number[1]).matches());
          25. Float result = null;
          26. Float[] numberF = {Float.valueOf(number[0]),Float.valueOf(number[1])};
          27. switch(character) {
          28. case "+":
          29. result = numberF[0] + numberF[1];
          30. break;
          31. case "-":
          32. result = numberF[0] - numberF[1];
          33. break;
          34. case "*":
          35. result = numberF[0] * numberF[1];
          36. break;
          37. case "/":
          38. result = numberF[0] / numberF[1];
          39. break;
          40. }
          41. System.out.println("结果是:" + result);
          42. }
          43. }
          44. 请输入第一个数字:7
          45. 请输入符号(+、-、*、/):/
          46. 请输入第二个数字:2
          47. 结果是:3.5
        2. 存在的问题
          1. 计算与页面没有进行分离,导致计算逻辑的代码无法得到复用(pc端和手机端需要开发两套代码)
          2. 没有使用面向对象的编程思想,导致了代码无法进行复用(其他部分带代码也想使用减法计算的时候需要复制粘贴,无法做到直接使用)
          3. 前端需要根据具体的运算方式来创建不同的对象,当增加运算类的时候,修改的地方过多。
      2. 面向对象开发
        1. 代码
          1. package staticFactoryMethod;
          2. import java.util.Arrays;
          3. import java.util.Scanner;
          4. import java.util.regex.Pattern;
          5. /**
          6. * 页面与逻辑分离
          7. * 面向对象编程
          8. */
          9. public class Second {
          10. public static void main(String[] args) throws Exception {
          11. //前端输入 计算需要的数字和符号
          12. Scanner scanner = new Scanner(System.in);
          13. Pattern NUMBER_PATTERN = Pattern.compile("-?\\d+(\\.\\d+)?");
          14. String[] number = new String[2];
          15. do {
          16. System.out.print("请输入第一个数字:");
          17. number[0] = scanner.nextLine();
          18. }while (!NUMBER_PATTERN.matcher(number[0]).matches());
          19. //这里是可用的计算方式
          20. String character;
          21. do {
          22. System.out.print("请输入符号(+、-、*、/):");
          23. character = scanner.nextLine();
          24. }while (!OperationFactory.checkCharacter(character));
          25. do {
          26. System.out.print("请输入第二个数字:");
          27. number[1] = scanner.nextLine();
          28. }while (!NUMBER_PATTERN.matcher(number[1]).matches());
          29. OperationFactory operationFactory = new OperationFactory();
          30. Operation operation = null;
          31. operation = operationFactory.createOperate(character);
          32. operation.setNumber1(Float.valueOf(number[0]));
          33. operation.setNumber2(Float.valueOf(number[1]));
          34. float result = operation.count();
          35. System.out.println("结果是:" + result);
          36. }
          37. }
          38. /**
          39. * 运算类
          40. * nunmber1 第一个运算符号
          41. * nunmber2 第二个运算符号
          42. * character 运算符号
          43. */
          44. class Operation {
          45. float number1;
          46. float number2;
          47. String character = null;
          48. public float getNumber1() {
          49. return number1;
          50. }
          51. public void setNumber1(float number1) {
          52. this.number1 = number1;
          53. }
          54. public float getNumber2() {
          55. return number2;
          56. }
          57. public void setNumber2(float number2) {
          58. this.number2 = number2;
          59. }
          60. public String getCharacter() {
          61. return character;
          62. }
          63. public void setCharacter(String character) {
          64. this.character = character;
          65. }
          66. public float count() {
          67. return 0;
          68. }
          69. }
          70. /**
          71. * 加法
          72. */
          73. class AddOperation extends Operation{
          74. public float count() {
          75. return number1 + number2;
          76. }
          77. }
          78. /**
          79. * 减法
          80. */
          81. class SubOperation extends Operation{
          82. public float count() {
          83. return number1 - number2;
          84. }
          85. }
          86. /**
          87. * 乘法
          88. */
          89. class MulOperation extends Operation{
          90. public float count() {
          91. return number1 * number2;
          92. }
          93. }
          94. /**
          95. * 除法
          96. */
          97. class DivOperation extends Operation{
          98. public float count() {
          99. return number1 / number2;
          100. }
          101. }
          102. /**
          103. * 创建运算类的工厂类
          104. */
          105. class OperationFactory {
          106. private static String[] characters = {"+","-","*","/"};
          107. public Operation createOperate(String character) throws Exception {
          108. if(!this.checkCharacter(character)) {
          109. throw new Exception("运算符错误或不存在");
          110. }
          111. switch(character) {
          112. case "+":
          113. return new AddOperation();
          114. case "-":
          115. return new SubOperation();
          116. case "*":
          117. return new MulOperation();
          118. case "/":
          119. return new DivOperation();
          120. }
          121. return null;
          122. }
          123. public String[] getCharacters() {
          124. return characters;
          125. }
          126. public void setCharacters(String[] characters) {
          127. this.characters = characters;
          128. }
          129. public static boolean checkCharacter(String character) {
          130. if(!Arrays.asList(characters).contains(character)) {
          131. return false;
          132. }
          133. return true;
          134. }
          135. }
          136. 请输入第一个数字:2
          137. 请输入符号(+、-、*、/):s
          138. 请输入符号(+、-、*、/):+
          139. 请输入第二个数字:23
          140. 结果是:25.0

        2. 解决的问题:
          1. 前后端进行分离,前端负责获取需要运算的数据和运算方式
          2. 加减乘除运算类封装,便于其他程序使用
          3. 通过创建工厂类,让前端无需关注具体的类,只要正常的传入相应的数据就可以了
    2. 总结:简单工厂的作用就是,让前端尽可能的不参与到具体逻辑上,这样就达到了解耦的目的。
    3. 简单工厂的缺点:等学完抽象工厂再回来补
  • 相关阅读:
    Python sorted()函数
    Java [ 进阶 ] JVM双亲委派机制✨
    视频转格式用什么工具?mp4格式转换器,好用的视频格式转换器
    【STL】函数对象(仿函数)谓词 内建函数对象
    【Unity3D】GUI控件
    spring kafka使用(三)
    使用Python进行页面开发——模板层
    ParameterizedType类型设置默认值
    C++ Qt开发:PushButton按钮组件
    Redis 哨兵集群工作原理
  • 原文地址:https://blog.csdn.net/xf552527/article/details/127754258