设计模式一之简单工厂模式

生活示例

刻板印刷–>活字印刷举例:喝酒唱歌,人生真爽。–>对酒当歌,人生几何。
可维护:需要修改,则只需要改需要改的字即可。
可复用:字体可在后来的印刷复用。
可扩展:需要加字,只需要加入相应的刻字即可。
灵活性好:字的排列可能竖排或横排,只需要活字移动即可。

代码示例

需求

实现一个简易计算器功能。

UML

在这里插入图片描述

代码

package simpleFactory;

/**
 * Created by yutong on 2018/11/4
 * 工厂类
 */
public class OperationFactory {
    public static Operation createOperation(String operate){
        Operation oper = null;
        switch (operate){
            case "+":
                oper = new OperationAdd();
                break;
            case "-":
                oper = new OperationSub();
                break;
            case "*":
                oper = new OperationMul();
                break;
            case "/":
                oper = new OperationDiv();
                break;
        }
        return  oper;
    }
}


package simpleFactory;

/**
 * Created by yutong on 2018/11/4
 * 运算类
 */
public class Operation {
      private double numA;
      private double numB;

    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 double getResult() throws Exception {
        double result = 0;
        return result;
    }
}

package simpleFactory;
/**
 * Created by yutong on 2018/11/4
 * 加法
 */
public class OperationAdd extends Operation {
    @Override
    public double getResult() {
        return getNumA() + getNumB();
    }
}
package simpleFactory;
/**
 * Created by yutong on 2018/11/4
 * 减法
 */
public class OperationSub extends Operation{
    @Override
    public double getResult() {
        return getNumA() - getNumB();
    }
}

package simpleFactory;
/**
 * Created by yutong on 2018/11/4
 * 乘法
 */
public class OperationMul extends Operation {
    @Override
    public double getResult() {
        return getNumA() * getNumB();
    }
}

package simpleFactory;
/**
 * Created by yutong on 2018/11/4
 * 除法
 */
public class OperationDiv extends Operation {
    @Override
    public double getResult() throws Exception {
        if (getNumB() == 0){
            throw new Exception("0不能做除数!");
        }
        return getNumA()/getNumB();
    }
}
package simpleFactory;
import java.util.Scanner;
/**
 * Created by yutong on 2018/11/4
 * 计算器client类
 */
public class Counter {
    public static void main(String[] args){
        try {
            System.out.println("======欢迎来到我的计算机世界=======");
            System.out.println("请输入您要计算的第一个数字:");
            Scanner scanner = new Scanner(System.in);
            String numA = scanner.next();
            System.out.println("请输入您要计算的第二个数字:");
            String numB = scanner.next();
            System.out.println("请输入运算符:");
            String oper = scanner.next();
            Operation operation = OperationFactory.createOperation(oper);
            operation.setNumA(Double.parseDouble(numA));
            operation.setNumB(Double.parseDouble(numB));
            System.out.println("计算结果为:"+operation.getResult());
        } catch (Exception e) {
            System.out.println("您输入有误"+e);
        }
    }
}

总结

代码是有艺术性的。将算法和界面解耦合(封装),将算法松耦合(继承&多态)。

简单工厂模式优缺点

优点:
使用户根据参数获得对应的类实例,避免了直接实例化类,降低了耦合性。

缺点:
可实例化的类型在编译期间已经被确定,如果增加新类型,则需要修改工厂,违背了开放封闭原则(ASD) 。 简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适合使用。

使用场景

工厂类负责创建的对象比较少。
客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心。

猜你喜欢

转载自blog.csdn.net/qq_34269117/article/details/83718504