1、简单工厂模式实现计算器功能

简单工厂模式实现计算机功能

文章目录

  • 简单工厂模式实现计算机功能
    • 简介
      • 创建型模式
    • 简单工厂模式
      • 概述
      • 流程
      • 结构
      • 理解
      • 类图
      • 优点
      • 缺点
      • 适用环境
    • 练习题目
    • 源代码

简介

创建型模式

了解简单工厂模式之前,首先要先了解下创建型模式,接下来的Java设计模式的学习,将会逐步学习创建型模式下的6种模式。

创建型模式描述如何将对象的创建和使用分离,让用户在使用对象时无须关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展。

在GoF设计模式中包含5种创建型模式,通常将一种非GoF设计模式——简单工厂模式作为学习其他工厂模式的基础。

模式名称 定义 学习难度 使用频率
简单工厂模式 定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类 ★★☆☆☆ ★★★☆☆
工厂方法模式 定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化,工厂方法模式让一个类的实例化延迟到其子类 ★★☆☆☆ ★★★★★
抽象工厂模式 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类 ★★★★☆ ★★★★★
建造者模式 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以构建不同的表示 ★★★★☆ ★★☆☆☆
原型模式 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象 ★★★☆☆ ★★★☆☆
单例模式 确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例 ★☆☆☆☆ ★★★★☆

简单工厂模式

概述

简单工厂模式并不属于GoF的23种经典设计模式,但通常将它作为学习其他工厂模式的基础。

定义:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。

由于在简单工厂模式中用于创建实例的方法通常是静态(static)方法,因此简单工厂模式又被称为静态工厂方法模式,是一种类创建型模式。

流程

首先将需要创建的各种不同产品对象的相关代码封装到不同的类中,,这些类称为具体产品类,而将它们公共的代码进行抽象和提取后封装在一个抽象产品类中,每一个具体产品类都是抽象产品类的子类;然后提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据所传入的参数不同创建不同的具体产品对象;客户端只需调用工厂类的工厂方法并传入相应的参数即可得到一个产品对象。

结构

简单工厂模式包含以下3个角色:

  1. Factory(工厂角色):工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑;工厂类可以被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法factoryMethod(),它的返回类型为抽象产品类型Product。
  2. Product(抽象产品角色):它是工厂类创建的所有对象的父类,封装了各种产品对象的公有方法,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个通用的工厂方法,因为所有创建的具体产品对象都是其子类对象。
  3. ConcreteProduct(具体产品角色):它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法。

理解

例如,现在有一家面包店,这家面包店就属于简单工厂模式下的工厂,面包店的菜单有许多产品,有面包、蛋糕、披萨,这些都是属于抽象产品角色,只是菜单上的名字,并不是实际产品。当有顾客点餐时,顾客看着菜单点菜,报出的菜名就相当于是客户端传给工厂的参数,工厂根据参数创建出对应的具体产品对象,即面包店根据顾客点的菜单,制作出对应的食物。

类图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-reD1xMrx-1601638036820)(D:\临时文件夹\img\image-20201001163254761.png)]

优点

  1. 工厂类包含必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的职责,而仅仅“消费”产品,简单工厂模式实现了对象创建和使用的分离。
  2. 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以在一定程度上减少使用者的记忆量。
  3. 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

缺点

  1. 由于工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响。
  2. 使用简单工厂模式势必会增加系统中类的个数(引入了新的工厂类),增加了系统的复杂度和理解难度。
  3. 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
  4. 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

适用环境

  1. 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
  2. 客户端只知道传入工厂类的参数,对于如何创建对象并不关心。

练习题目

按如下类图重新编写四则运算的应用程序Calc2(不要在原有程序上修改)。类的内部实现可以不同,类结构必须完全相同。

1、简单工厂模式实现计算器功能_第1张图片

源代码

Clac2.java

import java.util.Scanner;

public class Calc2 {
     
    public static void main(String[] args) {
     
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入运算符号:");
        String sign = scanner.next();
        System.out.print("请输入数字1:");
        double num1 = scanner.nextDouble();
        System.out.print("请输入数字2:");
        double num2 = scanner.nextDouble();

        Operator product = Factory.getOperator(sign);
        System.out.println(product.getResult(num1,num2));
    }
}

Factory.java

public class Factory {
     
    //静态工厂方法
    public static Operator getOperator(String arg) {
     
        Operator product = null;
        if (arg.equalsIgnoreCase("+")) {
     
            product = new Add();
            //初始化设置product
        }
        else if (arg.equalsIgnoreCase("-")) {
     
            product = new Sub();
            //初始化设置product
        }
        else if (arg.equalsIgnoreCase("*")) {
     
            product = new Mul();
            //初始化设置product
        }
        else if (arg.equalsIgnoreCase("/")) {
     
            product = new Div();
            //初始化设置product
        }

        return product;
    }
}

Operator.java

public interface  Operator{
     
    public double getResult(double num1,double num2);
}

Add.java

public class Add implements Operator{
     
    public double getResult(double num1, double num2) {
     
        return num1+num2;
    }
}

Sub.java

public class Sub implements Operator{
     
    public double getResult(double num1, double num2) {
     
        return num1 - num2;
    }
}

Mul.java

public class Mul implements Operator{
     
    public double getResult(double num1, double num2) {
     
        return num1 * num2;
    }
}

Div.java

public class Div implements Operator{
     
    public double getResult(double num1, double num2) {
     
        return num1 / num2;
    }
}

本篇文章参考书籍有:
《Java设计模式》 刘伟——清华大学出版社,2018


作者:阿涛
CSDN博客主页:https://blog.csdn.net/qq_43313113
如有不对的地方,欢迎在评论区指正
欢迎大家关注我,我将持续更新更多的文章


你可能感兴趣的:(Java设计模式,java,设计模式)