设计模式——简单工厂模式

1 概述

将创造对象的工作交给一个单独的类来实现 ,这个单独的类就是工厂。

2 实现

假设要做一个计算器的需求,通常我们想到的是这样写:

java 复制代码
package com.example.easyfactory;

import java.util.Scanner;

public class Demo1 {
    public static void main(String[] args) {
        try {
            Scanner sc =new Scanner(System.in);
            System.out.println("请输入数字A:");
            double numberA = Double.parseDouble(sc.nextLine());
            System.out.println("请输入运算符(+、-、*、/):");
            String strOperate = sc.nextLine();
            System.out.println("请输入数字B:");
            double numberB = Double.parseDouble(sc.nextLine());
            double result = 0d;

            switch (strOperate) {
                case "+":
                    result = numberA + numberB;
                    break;
                case "-":
                    result = numberA - numberB;
                    break;
                case "*":
                    result = numberA * numberB;
                    break;
                case "/":
                    result = numberA / numberB;
                    break;
            }
            System.out.println("结果是:" + result);
        }catch (Exception e) {
            System.out.println("输入有错");
        }
    }
}

但这段代码的问题在于,其一显示和业务逻辑没有分离,其二是没有使用面向对象的编程思想,可扩展性和可重用性都很差。

可以考虑使用简单工厂模式,将各个计算逻辑进行分离,成为单独的类,在工厂类中根据传入的参数构造不同预算符对象。

运算符抽象类:

java 复制代码
public abstract class Operation {
    public double getResult(double numberA, double numberB) {
        return 0d;
    }
}

接下来是四个具体的运算符类

java 复制代码
public class Add extends Operation{
    @Override
    public double getResult(double numberA, double numberB) {
        return numberA + numberB;
    }
}
java 复制代码
public class Sub extends Operation{
    @Override
    public double getResult(double numberA, double numberB) {
        return numberA - numberB;
    }
}
java 复制代码
public class Mul extends Operation{
    @Override
    public double getResult(double numberA, double numberB) {
        return numberA * numberB;
    }
}
java 复制代码
public class Div extends Operation {
    @Override
    public double getResult(double numberA, double numberB) {
        if (numberB == 0) {
            System.out.println("除数不能为0");
            throw new ArithmeticException();
        }
        return numberA / numberB;
    }
}

工厂类

java 复制代码
public class OperationFactory {
    public static Operation createOperation(String operate) {
        Operation oper = null;
        switch (operate) {
            case "+":
                oper = new Add();
                break;
            case "-":
                oper = new Sub();
                break;
            case "*":
                oper = new Mul();
                break;
            case "/":
                oper = new Div();
                break;
        }
        return oper;
    }
}

测试类

java 复制代码
public class Test {
    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        System.out.println("请输入数字A:");
        double numberA = Double.parseDouble(sc.nextLine());
        System.out.println("请输入运算符(+、-、*、/):");
        String strOperate = sc.nextLine();
        System.out.println("请输入数字B:");
        double numberB = Double.parseDouble(sc.nextLine());
        double result = 0d;

        Operation oper = OperationFactory.createOperation(strOperate);
        result = oper.getResult(numberA, numberB);
        System.out.println("结果为:" + result);
    }
}

根据传入的参数的不同,来从工厂类中获取具体的运算符类对象,并调用运算方法。

3 总结

简单工厂模式就是通过一个抽象类抽象出一个抽象类和一个公共操作方法。具体的操作类来继承抽象类,并重写该方法。工厂中根据传入参数的不同来构造具体的操作类对象,并赋值给其父类(即抽象类),实际运行时由于多态特性,会运行具体操作类中被重写的方法。

相关推荐
夜晚回家7 分钟前
「Java基本语法」代码格式与注释规范
java·开发语言
斯普信云原生组18 分钟前
Docker构建自定义的镜像
java·spring cloud·docker
wangjinjin18022 分钟前
使用 IntelliJ IDEA 安装通义灵码(TONGYI Lingma)插件,进行后端 Java Spring Boot 项目的用户用例生成及常见问题处理
java·spring boot·intellij-idea
wtg445222 分钟前
使用 Rest-Assured 和 TestNG 进行购物车功能的 API 自动化测试
java
白宇横流学长1 小时前
基于SpringBoot实现的大创管理系统设计与实现【源码+文档】
java·spring boot·后端
fat house cat_1 小时前
【redis】线程IO模型
java·redis
stein_java2 小时前
springMVC-10验证及国际化
java·spring
weixin_478689762 小时前
C++ 对 C 的兼容性
java·c语言·c++
LUCIAZZZ3 小时前
HikariCP数据库连接池原理解析
java·jvm·数据库·spring·springboot·线程池·连接池
胡侃有料3 小时前
【设计模式】1.简单工厂、工厂、抽象工厂模式
设计模式·抽象工厂模式