设计模式——工厂模式(Factory Method)

  工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。

UML图:

  运算基类:

  

package com.cnblog.clarck;

/**
 * 数据运算基类
 * 
 * @author clarck
 * 
 */
public class Operation {
    private double mNmberA = 0;
    private double mNumberB = 0;

    public double getNumberA() {
        return mNmberA;
    }

    public void setNmberA(double numberA) {
        this.mNmberA = numberA;
    }

    public double getNumberB() {
        return mNumberB;
    }

    public void setNumberB(double numberB) {
        this.mNumberB = numberB;
    }
    
    /**
     * 获取运算结果
     * @return
     */
    public double getResult() {
        double result = 0;
        return result;
    }

}

  

  具体产品类:

package com.cnblog.clarck;

/**
 * 加法类
 * 
 * @author clarck
 * 
 */
public class OperationAdd extends Operation {

    @Override
    public double getResult() {
        double result = 0;
        result = getNumberA() + getNumberB();
        return result;
    }

}

  

package com.cnblog.clarck;

/**
 * 减法类
 * 
 * @author clarck
 * 
 */
public class OperationSub extends Operation {

    @Override
    public double getResult() {
        double result = getNumberA() - getNumberB();
        return result;
    }

}
package com.cnblog.clarck;

/**
 * 乘法
 * 
 * @author clarck
 * 
 */
public class OperationMul extends Operation {

    @Override
    public double getResult() {
        double result = getNumberA() * getNumberB();
        return result;
    }

}
package com.cnblog.clarck;

/**
 * 除法类
 * 
 * @author clarck
 * 
 */
public class OperationDiv extends Operation {

    @Override
    public double getResult() {
        if (getNumberB() == 0) {
            throwException();
        }

        double result = getNumberA() / getNumberB();
        return result;
    }

    private void throwException() {
        try {
            throw new Exception("the div number can't be zero.");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

  工厂类接口:

package com.cnblog.clarck;

/**
 * 算法工厂
 * 
 * @author clarck
 * 
 */
public interface IFactory {
    public Operation createOperation();
}

  工厂类:

package com.cnblog.clarck;

/**
 * 加法工厂
 * 
 * @author clarck
 * 
 */
public class AddFactory implements IFactory {

    @Override
    public Operation createOperation() {
        return new OperationAdd();
    }

}
package com.cnblog.clarck;

/**
 * 减法工厂
 * 
 * @author clarck
 * 
 */
public class SubFactory implements IFactory {

    @Override
    public Operation createOperation() {
        return new OperationSub();
    }

}
package com.cnblog.clarck;

/**
 * 乘法
 * 
 * @author clarck
 * 
 */
public class MulFactory implements IFactory {

    @Override
    public Operation createOperation() {
        return new OperationMul();
    }

}
package com.cnblog.clarck;

/**
 * 除法工厂
 * 
 * @author clarck
 * 
 */
public class DivFactory implements IFactory {

    @Override
    public Operation createOperation() {
        return new OperationDiv();
    }

}

  运算符号类:

package com.cnblog.clarck;

/**
 * 加法, 减法, 乘法, 除法
 * 
 * @author clarck
 * 
 */
public enum OperationSymbol {
    ADDITION, SUBTRACTION, MULTIPLICATION, DIVISION
}

  测试类:

package com.cnblog.clarck;

/**
 * 测试类
 * 
 * @author clarck
 * 
 */
public class Client {
    public static void main(String[] args) {
        IFactory operFactory = new AddFactory();
        Operation operation = operFactory.createOperation();
        operation.setNmberA(1);
        operation.setNumberB(2);
        double result = operation.getResult();
        System.out.println("add result: " + result);

        operFactory = new SubFactory();
        Operation subOperation = operFactory.createOperation();
        subOperation.setNmberA(1);
        subOperation.setNumberB(2);
        double subResult = subOperation.getResult();
        System.out.println("sub result: " + subResult);

        operFactory = new MulFactory();
        Operation mulOperation = operFactory.createOperation();
        mulOperation.setNmberA(1);
        mulOperation.setNumberB(2);
        double mulResult = mulOperation.getResult();
        System.out.println("mul result: " + mulResult);

        operFactory = new DivFactory();
        Operation divOperation = operFactory.createOperation();
        divOperation.setNmberA(1);
        divOperation.setNumberB(2);
        double divResult = divOperation.getResult();
        System.out.println("div result: " + divResult);

    }
}
原文地址:https://www.cnblogs.com/tanlon/p/3391163.html