JAVA设计模式——简单工厂模式(不属于)

首先在开篇需要提出一下,简单工厂模式并不属于23种设计模式的其中一种。

 

简单工厂模式,属于创建型模式,也叫做静态工厂方法模式。由一个工厂对象决定创建出哪一种产品的实例。

 

一、介绍

        定义一个创建对象的工厂类,根据传入参数来自己决定实例化哪一个产品类。

简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。

 

二、何时使用

       1、我们明确地计划不同条件下创建不同实例时。

2、创建的对象比较少,这样不会造成工厂方法中业务逻辑过于复杂。

3、调用者不需要关心对象的创建,只需要知道传入给定参数,返回相关数据即可

 

三、优点

1、调用者可以避免直接创建产品对象,甚至不需要关系了解创建的相关细节,这样的责任分割,有利于调用者更加专注处理业务逻辑,一切产品对象的需求,都可以交给工厂类来实现。

2、调用者不需要知道产品类的名称,只要传递相关参数即可。

3、在添加新的产品类时,不需要修改调用者的逻辑代码,提高了灵活性。

 

四、缺点

1、过分依赖工厂类,若工厂类中出现问题,则可能导致整个系统受到影响。

2、当新增一个产品时,需要想对应的修改工厂类,相对不利于扩展。

 

-------------------------------------------------------------------我是华丽的分割线-------------------------------------------------------------------

 

说了这么多概念性的东西,相信大家还是比较模糊,毕竟没有代码的技术博客是不完整的。

接下来,就让我们用代码来实现一下简单工厂设计模式。

 

让我们设计一个场景,做一个计算器,实现加减乘除,利用简单工厂设计模式。

按照我们上面所说,简单工厂设计模式里面,需要有工厂类和产品类,在这里,我们加、减、乘、除分别是一个完整的产品,并且他们还有共性,都有两个数字参与运算。根据这样的分析,我们可以画出UML图(这个图在关系上花的有一些问题,画图软件不好用,找不到需要的关联箭头,我之后再找找,有合适的画图软件后,会更新一下这个图)。

根据上面的UML图,我们可以很清晰的看到结构。

接下来,就是放大招的时候了

-------------------------------------------上代码-------------------------------------------

 

来看看Operation类怎么写

public class Operation {

    private double numberA;
    private double numberB;

    public Operation() {
    }


    public double getNumberA() {
        return numberA;
    }

    public void setNumberA(double numberA) {
        this.numberA = numberA;
    }

    public double getNumberB() {
        return numberB;
    }

    public void setNumberB(double numberB) {
        this.numberB = numberB;
    }

    public double getResult() {
        double result = 0;
        return result;
    }

接下来就是加减乘除四兄弟了,其实套路是一样的

public class OperationAdd extends Operation {

    @Override
    public double getResult() {
        return getNumberA() + getNumberB();
    }
}
public class OperationSub extends Operation {

    @Override
    public double getResult() {
        return getNumberA() - getNumberB();
    }
}
public class OperationMul extends Operation {

    @Override
    public double getResult() {
        return getNumberA() * getNumberB();
    }
}
public class OperationDiv extends Operation {

    @Override
    public double getResult() {
        if (getNumberB() == 0) {
            throw new NumberFormatException("numberB 不能为 0");
        }
        return getNumberA() / getNumberB();
    }
}

在这里注意一下,除法运算,我们需要检验除数是否为0,所以在进行运算前,我进行一个判断。

接着我们看看这个工厂类要如何写

public class OperationFactory {

    public static Operation createOperation(String operation) {
        Operation opera = null;
        switch (operation) {
            case "+":
                opera = new OperationAdd();
                break;
            case "-":
                opera = new OperationSub();
                break;
            case "*":
                opera = new OperationMul();
                break;
            case "/":
                opera = new OperationDiv();
                break;
            default:
                break;
        }
        return opera;
    }

}

好,至此,我们这个小demo就已经写好了,接下来就是调用者的问题了,谁来调用,我们可以是可视化界面,也可以是命令行界面,当然也可以像我偷懒一样,凑合测试,哈哈哈哈哈哈哈~~~~~~~展示一下,调用流程

public class Demo {
    
    public static void main(String[] args) {
        Operation operation = OperationFactory.createOperation("/");
        operation.setNumberA(2);
        operation.setNumberB(1);
        System.out.println(operation.getResult());
    }
}

 

代码其实so easy~~~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值