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的集合去处理。
    这样就是最美的了么?答案是否定的。

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

    谢谢你能看到这里。下一话:策略模式。
    
  • 相关阅读:
    软考之操作系统
    牛腩javascript(二)之正则表达式
    牛腩javascript(一)
    软考之算法
    软考之数据结构
    软考之路之刷屏开始
    XML中的几种比较
    北大青鸟ASP.NET之总结篇
    Webassembly 学习2 -- Js 与C 数据交互
    nginx-proxy_redirect
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5327669.html
Copyright © 2011-2022 走看看