首页 > 其他分享 >设计模式——工厂三兄弟之简单工厂

设计模式——工厂三兄弟之简单工厂

时间:2024-05-28 21:05:27浏览次数:14  
标签:numberb numbera System 工厂 兄弟 println 设计模式 public out

1.业务需求

​ 大家好,我是菠菜。在介绍这期简单工厂设计模式前,我们先来看看这样的需求:制作一个简单的计算器,能够实现控制台输入俩个数以及运算符完成运算
计算器

2.初步实现

实现第一版思路:

​ 创建计算器类,控制台输入俩个数以及运算符,通过if条件输出运算结果。

CalClient 类:

public class CalClient {
    public static void main(String[] args) {

        Scanner sc=new Scanner(System.in);
        System.out.println("请输入第一个数:");
        double numbera=sc.nextDouble();
        System.out.println("请输入运算符:");
        String operator=sc.next();
        System.out.println("请输入第二个数:");
        double numberb=sc.nextDouble();
        
        if("+".equals(operator)){
            System.out.println("运算结果为:"+(numbera+numberb));
        }else  if("-".equals(operator)){
            System.out.println("运算结果为:"+(numbera-numberb));
        }else  if("*".equals(operator)){
            System.out.println("运算结果为:"+(numbera*numberb));
        }else  if("/".equals(operator)){
            if(numberb==0){
                System.out.println("除数不能为零");
                return;
            }
            System.out.println("运算结果为:"+(numbera/numberb));
        }
    }
}

思考:这段代码在当时初学编程来说,没有问题,而且结果都能执行成功并输出。但是现在我们再来看是不是有点不太满意的地方,比如:计算控制台逻辑和计算方法逻辑耦合在一起,不满足上一期我们所学的单一职责原则,于是我又优化了一版。

实现第二版思路:

​ 增加Operation运算类,将计算方法封装到里面,把计算控制台逻辑和计算方法拆开,降低耦合。

Operation类:

public class Operation {

    public static Double getOperationResult(double numbera,double numberb,String operator){
        Double result=null;

        switch (operator){
            case "+":
                result=numbera+numberb;
                break;
            case "-":
                result=numbera-numberb;
                break;
            case "*":
                result=numbera*numberb;
                break;
            case "/":
                if(numberb==0){
                    System.out.println("除数不能为零");
                    return result;
                }
                result=numbera/numberb;
                break;
        }

        return result;
    }
}

CalClient类:

public class CalClient {
    public static void main(String[] args) {

        Scanner sc=new Scanner(System.in);
        System.out.println("请输入第一个数:");
        double numbera=sc.nextDouble();
        System.out.println("请输入运算符:");
        String operator=sc.next();
        System.out.println("请输入第二个数:");
        double numberb=sc.nextDouble();

    //2.将业务逻辑和界面逻辑分开 解耦
    System.out.println("运算结果为:"+(Operation.getOperationResult(numbera,numberb,operator)));
    }
}

​ **思考:**上述代码,虽然将控制台和计算方法解耦,而且这个计算方法类可以做到一定程度上的复用,但是又有了一些新的问题:后续添加或修改计算方法要修改整个Operation类并编译,不安全而且会影响到正常运行的代码,而且该设计没有面向对象编程。我思考了一下,于是就有了下一个升级版本。

3.方案改进

实现第三版本思路:

​ 增加类OperationFactory,用于实例化具体的计算实例。增加抽象类AOpeartion,提取统一计算方法。增加计算实现类OperationAdd、OperationSub、OperationMul、OperationDiv。

在这里插入图片描述

OperationFactory类:

public class OperationFactory {

    public static AOpeartion createOperation(String operator){
        AOpeartion opeartion=null;
        switch (operator){
            case "+":
                opeartion=new OperationAdd();
                break;
            case "-":
                opeartion=new OperationSub();
                break;
            case "*":
                opeartion=new OperationMul();
                break;
            case "/":
                opeartion=new OperationDiv();
                break;
        }

        return opeartion;
    }
}

AOpeartion类:

public abstract class AOpeartion {
    public abstract Double getOperationResult(double numbera, double numberb);
}

OperationAdd类:

public class OperationAdd extends AOpeartion {
    @Override
    public Double getOperationResult(double numbera, double numberb) {
        return numbera+numberb;
    }
}

OperationSub类:

public class OperationSub extends AOpeartion {
    @Override
    public Double getOperationResult(double numbera, double numberb) {
        return numbera-numberb;
    }
}

OperationMul类:

public class OperationMul extends AOpeartion {
    @Override
    public Double getOperationResult(double numbera, double numberb) {
        return numbera*numberb;
    }
}

OperationDiv类:

public class OperationDiv extends AOpeartion {
    @Override
    public Double getOperationResult(double numbera, double numberb) {
        if(numberb==0){
            System.out.println("除数不能为零");
            return null;
        }
        return numbera/numberb;
    }
}

CalClient类:

public class CalClient {
    public static void main(String[] args) {

        Scanner sc=new Scanner(System.in);
        System.out.println("请输入第一个数:");
        double numbera=sc.nextDouble();
        System.out.println("请输入运算符:");
        String operator=sc.next();
        System.out.println("请输入第二个数:");
        double numberb=sc.nextDouble();

     //3.利用简单工厂实现 易维护 易复用 易拓展
        AOpeartion opeartion=OperationFactory.createOperation(operator);
        if(null!=opeartion){
            System.out.println("运算结果为:"+(opeartion.getOperationResult(numbera,numberb)));
        }else{
            System.out.println("运算工厂获取运算类失败");

        }

    }
}

​ 思考:OperationFactory工厂类通过输入的运算符去实例化相应合适的对象,通过多态返回父类的方式实现了计算器的结果。后续如果修改具体的计算方法只要修改具体的计算类即可,不会影响其它计算类。如果增加计算方法,增加实现相应的计算类的具体子类以及增加计算工厂类的switch分支即可。

4.定义和组成结构

​ 工厂模式的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”。在简单工厂模式中创建实例的方法通常为静态(static)方法,因此简单工厂模式(Simple Factory Pattern)又叫作静态工厂方法模式(Static Factory Method Pattern)。

简单工厂模式的主要角色如下:

​ 简单工厂(SimpleFactory):是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
​ 抽象产品(AbstractProduct):是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口。
​ 具体产品(ConcreteProduct):是简单工厂模式的具体创建目标。

简单工厂模式

5.优缺点以及应用场景

优点:

  • 简单工厂模式实现了对象创建和使用的分离,职责分明
  • 客户端无需知道所创建具体对象的类名,只需知道参数即可

缺点:

  • 工厂类集中了所有产品的创建逻辑,职责过重
  • 系统扩展困难,添加新产品要修改原有逻辑,违反了开闭原则,产品种类一多,工厂类逻辑过于复杂,不利有扩展和维护

应用场景: 对于产品种类相对较少的情况,考虑使用简单工厂模式。使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关心如何创建对象的逻辑,可以很方便地创建所需产品。

友情提示:请尊重作者劳动成果,如需转载本博客文章请注明出处!谢谢合作!
【作者:我爱吃菠菜 个人博客地址

标签:numberb,numbera,System,工厂,兄弟,println,设计模式,public,out
From: https://blog.csdn.net/love_spinach/article/details/139261525

相关文章

  • 【工厂模式应用】
    工厂模式应用1.需求描述2.类图设计3.代码实现3.1解析器3.2解析器工厂3.3解析器代理4.测试1.需求描述不同协议进行不同解析规则,能否创建一个工厂根据当前协议类型提供解析器进行解析2.类图设计3.代码实现3.1解析器IParser:基类IParser......
  • 简单工厂模式、工厂模式、抽象工厂模式
    工厂模式(FactoryPattern)是一种创建对象的设计模式,它提供了一种方法来将对象的创建过程与对象的使用过程分离。工厂模式在软件开发中有广泛的应用,适用于不同的场景和需求。下面是几种常见的工厂模式及其应用场景:1.简单工厂模式(SimpleFactoryPattern)简单工厂模式通过一个工厂......
  • 仓储未来已来:揭秘3D可视化工厂园区的魅力与实力
    在快节奏的现代生活中,物流仓储行业扮演着至关重要的角色。随着科技的飞速发展,传统仓储模式正面临一场前所未有的变革。今天,就让我们一起看看3D可视化技术如何为物流行业带来前所未有的便利与效率。 什么是3D可视化工厂园区?3D可视化工厂园区,就是将传统的仓储工厂园区通过先进的......
  • 工厂方法模式(Factory Method Pattern)
    工厂方法模式(FactoryMethodPattern)是一种创建型设计模式,它在父类中提供一个创建对象的方法,允许子类决定实例化哪一个类。工厂方法模式将对象的实例化推迟到子类中进行,使得系统在不修改原有代码的情况下可以扩展,从而实现了开闭原则(对扩展开放,对修改关闭)模式结构抽象工厂(Abstr......
  • 抽象工厂模式(Abstract Factory)
    抽象工厂模式(AbstractFactoryPattern)是一种创建型设计模式,它提供了一种方式,将一组具有共同主题的单独的工厂封装起来,而不需要指定它们的具体类。抽象工厂模式允许客户端在不指定具体类的情况下创建一系列相互关联或相互依赖的产品族。模式结构抽象工厂模式包含以下角色:抽象......
  • 设计模式概要
    常见的5中设计模式1.但通常所说的“23种设计模式”是指那些在实践中被广泛认可和使用的设计模式。这些设计模式可以分为以下三类:创建型模式(CreationalPatterns):用于处理对象的创建机制,以提高系统的灵活性和可重用性。单例模式(Singleton):确保一个类只有一个实例,并提供一个全局......
  • 设计模式大纲
    设计模式大纲设计模式(DesignPattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式可以提高代码的可读性、可扩展性、可靠性和可测试性。设计模式是软件工程中常用的一种软件设计原则,它是一套被反复使用、多数人知晓的、经过分类的、代码设计......
  • 第一章 设计模式、UML图、软件设计原则
    本系列博客主要参考黑马程序员的Java设计模式详解视频教程1.设计模式概述1.1软件设计模式的概念软件设计模式(SoftwareDesignPattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生......
  • 第七十五节 Java设计模式 - 模板方法模式
    Java设计模式-模板方法模式在模板模式中,父抽象类公开几个抽象方法供子类实现。在父抽象类中有另一个方法或几个方法使用抽象方法来实现业务逻辑。抽象方法通常用于父类所需的每个步骤。例如,为了使用新的软件,我们需要下载,安装,配置和运行。如果我们要使用模板模式来编码逻......
  • c++设计模式-装饰器模式和代理模式
    namespace_nmsp1{//抽象的控件类classControl{public:virtualvoiddraw()=0;//draw方法,用于将自身绘制到屏幕上。public:virtual~Control(){}//做父类时析构函数应该为虚函数};//列表控件类classListCtrl......