模式设计:简单工厂模式

近读《大话模式设计》一书,更感感受本身对软件设计方面一窍不通,实在是个“码农”。功过此书对软件工程等方面的基础知识有个简单的了解,在此将我的理解整理,备案。java

简单工厂模式又称为静态工厂模式,是由一个工厂对象来肯定具体实例化哪一个产品实例。用户只需传入条件,工厂根据条件返回符合要求的产品实例。
ide

例子:this

根据用户的选择,进行加、减、乘、除运算。若是按照我原来的code习惯,应该是:设计

if ("+") {
  //没有任何返利
}
if ("-"){
  //
}
if ("*") {
  //  
}

此处的毛病就是对用户的一个状态,代码要进行屡次判断,并且每次返回不一样的数据都会彻底暴露给用户,没有作好数据的封装。若是:code

switch("四则运算"){
case "+":
    ...
    break;
    
    case "-":
    ...
    break;
    
    case "*":
    ...
    break;
    ...
}

则会避免数据外泄。而且易于扩展。对象

实例:get

//全部操做类的父类
public abstract class Operation {
    public Operation() {

    }

    public double getNumA() {
        return numA;
    }

    public void setNumA(double numA) {
        this.numA = numA;
    }

    public double getNumB() {
        return numB;
    }

    public void setNumB(double numB) {
        this.numB = numB;
    }

    public abstract double getResult();

    private double numA = 0;
    private double numB = 0;
}

/**
 * 加法类
 * */
class OperationAdd extends Operation {
    public OperationAdd() {
        super();
    }

    @Override
    public double getResult() {
        return (getNumA() + getNumB());
    }
}

/**
 * 减法类
 * */
class OperationSub extends Operation {
    public OperationSub() {
        super();
    }

    @Override
    public double getResult() {
        return (getNumA() - getNumB());
    }
}

/**
 * 乘法类
 * */
class OperationMul extends Operation {
    public OperationMul() {
        super();
    }

    @Override
    public double getResult() {
        return (getNumA() * getNumB());
    }
}

/**
 * 除法类,当除数为0时,返回值为0
 * */
class OperationDiv extends Operation {
    public OperationDiv() {
        super();
    }

    public double getResult() {
        if (getNumB() != 0) {
            return (getNumA() / getNumB());
        } else {
            return 0;
        }
    }
}

四则运算的标志集合:
产品

enum OperatorCollection {
    ADD,
    SUB,
    MUL,
    DIV
}

具体工厂类:it

public class OperationFactory {
    public static Operation createFactory(OperatorCollection oc) {
        Operation op = null;

        switch (oc) {
            case ADD:
                op = new OperationAdd();
                break;

            case SUB:
                op = new OperationSub();
                break;

            case MUL:
                op = new OperationMul();
                break;

            case DIV:
                op = new OperationDiv();
                break;
        }

        return op;
    }

    private OperationFactory() {

    }
}

main类:io

public class ClientClass {
    public static void main(String[] args) {
        new ClientClass().operationFunction(20, 33, OperatorCollection.MUL);
    }

    private void operationFunction(double numA, double numB, OperatorCollection oc) {
        Operation op = OperationFactory.createFactory(oc);
        op.setNumA(numA);
        op.setNumB(numB);

        String operator = "";
        switch (oc) {
            case ADD:
                operator = " + ";
                break;

            case SUB:
                operator = " - ";
                break;

            case MUL:
                operator = " * ";
                break;

            case DIV:
                operator = " / ";
                break;
        }

        System.out.println(numA + operator + numB + " = " + op.getResult());
    }
}

只要输入数字和运算符号,直接就能够进行计算,并且数据也可封装。

相关文章
相关标签/搜索