zoukankan      html  css  js  c++  java
  • 第一话-简单工厂模式

    写在前面:本人近期在看《大话设计模式》这本书,书里是用C#解说的实例。如今写心得笔记与大家分享。就试着写一个JAVA版的。

    样例还是书里的样例。只是是Java语言实现的。后面也会给出本人的一些理解建议。

    谢谢《大话设计模式》的作者。

    一、什么是简单工厂模式?

    简单工厂模式是工厂模式里最简单的一种。所以叫做简单工厂模式。简单工厂模式须要一个工厂类去对类的实例进行条件分发,这样能够省去程序分发时的麻烦。而且把分发的代码从主类中移到一个单独的类里,这样既能使代码简洁明了,有使代码灵活性争强。

    详细请看以下的样例。

    二、用于什么情况?

    工厂类负责创建的对象比較少;
    客户仅仅知道传入工厂类的參数。对于怎样创建对象(逻辑)不关心;
    因为简单工厂非常容易违反高内聚责任分配原则。因此一般仅仅在非常easy的情况下应用。
    三、懂了么?请看实例(计算器)。
    做一个简单计算器。无非操作数1,操作符,操作数2。

    既然是用面向对象的语言,那咱们就以面向对象的思想进行设计。

    为了使代码可重用,不用复制粘贴,那咱们就把处理和交互进行分离:这样就有了Operation类和Main类
    可是这样还不够好。全部的操作(加减乘除)都放到一个类里,这样对代码的扩展性不好,所以咱们就把这些操作分离。那咱么就能够再把Operation类分离,分离成一个主类Operation和四个子类AddOperation,SubOperation,MulOperation,DivOperation去继承Operation类
    已经晕了么?不要紧,看下去。
    你可能感觉这样已经能够了。但不要忘了咱们的重点。咱们的重点是“简单工厂模式”,那咱们就用他了。

    他不是分发么,咱们的程序是计算,那显示里肯定有计算的对象啊,那咱们该用哪个类的对象去做运算呢?你可能想到了依据用户输入的“运算符”来选择,正确。

    但是这个选择要是放到显示交互的主类里,那是不是没有把逻辑处理和显示交互分离干净?所以用咱们的简单工厂模式,建立一个工厂类OperationFactory去负责分发创建这些类。这样主类就不用考虑这些了,是不是感觉非常清晰了呢?好。上代码。


    Main.java
    /**
    *主要负责与用户交互。让用户输入数据,处理后输出数据
    **/
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    public class Main {
     public static void main(String[] args) throws IOException {
      // TODO Auto-generated method stub
      String num1 = "0";
      String num2 = "0";
      String ope = "+";
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      System.out.print("请输入第一个操作数:");
      num1 = in.readLine();
      System.out.print("请输入操作符('+','-','*','/'):");
      ope = in.readLine();
      System.out.print("请输入第二个操作数:");
      num2 = in.readLine();
      Operation operation = OperationFactory.createOperation(ope);
      if (operation != null) {
       operation.setNumber1(Double.parseDouble(num1.trim()));
       operation.setNumber2(Double.parseDouble(num2.trim()));
       System.out.println("计算结果为:" + operation.calculate());
      }
     }
    }

    Operation.java
    /**
    *操作类,仅仅有两个处理数;注意此类为抽象类。有一个重要的方法calculate()这个是计算的重点,由于操作是有其子类完毕所以定义为抽象方法让子类去各自实现
    **/
    public abstract class Operation {
     protected double number1;
     protected double number2;
     public double getNumber1() {
      return number1;
     }
     public void setNumber1(double number1) {
      this.number1 = number1;
     }
     public double getNumber2() {
      return number2;
     }
     public void setNumber2(double number2) {
      this.number2 = number2;
     }
     public abstract double calculate();
    }

    AddOperation.java
    public class AddOperation extends Operation {
     public double calculate() {
      // TODO Auto-generated method stub
      double result = number1 + number2;
      return result;
     }
    }

    SubOperation.java
    public class SubOperation extends Operation {
     public double calculate() {
      // TODO Auto-generated method stub
      double result = number1 - number2;
      return result;
     }
    }

    MulOperation.java
    public class MulOperation extends Operation {
     public double calculate() {
      // TODO Auto-generated method stub
      double result = number1 * number2;
      return result;
     }
    }

    DivOperation.java
    public class DivOperation extends Operation {
     public double calculate() {
      // TODO Auto-generated method stub
      if (number2 != 0) {
       double result = number1 / number2;
       return result;
      }
      System.out.println("number cannot be the 0");
      return 0;
     }
    }

    OperationFactory.java
    /**
    *此为工厂类,进行对象的分发
    **/
    public class OperationFactory {
     public static Operation createOperation(String operator) {
      Operation operation = null;
      if ("+".equals(operator)) {
       operation = new AddOperation();
      } else if ("-".equals(operator)) {
       operation = new SubOperation();
      } else if ("*".equals(operator)) {
       operation = new MulOperation();
      } else if ("/".equals(operator)) {
       operation = new DivOperation();
      }
      return operation;
     }
    }

    四、小结和建议
    简单工厂模式是很easy的一个模式,所以使用的情况也很的局限。

    事实上你无形中已经使用过这个模式。仅仅是你没发现而已。

    不信。你想想。

    程序尽管已经完毕。但还有非常多要考虑的问题,比方:
    本文中是用的double类型,假设用户非要求用int型怎么办?所以能够用泛型;
    此程序的操作数仅仅有两个。万一有好多操作数呢?能够用java的集合去处理。
    这样就是最美的了么?答案是否定的。

    问题留给聪明的你。相信你肯定能想到。

    谢谢你能看到这里。下一话:策略模式。
    
  • 相关阅读:
    模板 无源汇上下界可行流 loj115
    ICPC2018JiaozuoE Resistors in Parallel 高精度 数论
    hdu 2255 奔小康赚大钱 最佳匹配 KM算法
    ICPC2018Beijing 现场赛D Frog and Portal 构造
    codeforce 1175E Minimal Segment Cover ST表 倍增思想
    ICPC2018Jiaozuo 现场赛H Can You Solve the Harder Problem? 后缀数组 树上差分 ST表 口胡题解
    luogu P1966 火柴排队 树状数组 逆序对 离散化
    luogu P1970 花匠 贪心
    luogu P1967 货车运输 最大生成树 倍增LCA
    luogu P1315 观光公交 贪心
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5327669.html
Copyright © 2011-2022 走看看