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

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 总结

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

相关推荐
噢,我明白了9 分钟前
表单的完整 CRUD 练习【极简个人记账本】(含前端后端链接mySQL)
java·前端·数据库·mysql
通往曙光的路上16 分钟前
mysql1
java
Tigshop开源商城5 小时前
『物流设置+SEO优化』Tigshop开源商城系统 JAVA v5.8.26 版本更新!
java·开源商城系统·tigshop
Tigshop开源商城7 小时前
『订单税率+收货地址校验国家字段』功能上新|跨境运营更高效,Tigshop开源商城系统 JAVA v5.8.23 版本更新
java·开源商城系统·tigshop
REDcker7 小时前
C++变量存储与ELF段布局详解 从const全局到rodata与nm_readelf验证实践
java·c++·面试
UXbot8 小时前
一人独立交付 UI + 前端:AI 驱动 UI 设计工具的五大功能模块深度评测
前端·低代码·ui·设计模式·交互
kobesdu8 小时前
【ROS2实战笔记-19】ROS2 生命周期节点的启动顺序、状态转换陷阱与热备方案
java·前端·笔记·机器人·ros·ros2
neo_Ggx238 小时前
Maven 版本管理详解:SNAPSHOT、Release 与 Nexus 仓库的区别和影响
java·maven
matlabgoodboy8 小时前
软件开发定制小程序APP帮代做java代码代编写C语言设计python编程
java·c语言·小程序
江离w9 小时前
新版vibecoding项目初始化指令
java