欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设计模式(一):简单工厂模式

程序员文章站 2022-03-10 09:54:24
描述 最近整理一些JAVA的基础的知识。 简单工厂模式,也就是说到底要实例化谁,将来会不会增加实例化的对象,比如计算算法的实现过程中,需要减加乘除得类,以后说不定还会增加开根运算等,所以应该考虑单独用一类来创造这个实力过程。 实现 为此我们就用简单工厂类实现加减乘除的算法计算。首先定义一个运算的接口 ......

描述


最近整理一些java的基础的知识。

简单工厂模式,也就是说到底要实例化谁,将来会不会增加实例化的对象,比如计算算法的实现过程中,需要减加乘除得类,以后说不定还会增加开根运算等,所以应该考虑单独用一类来创造这个实力过程。

实现


为此我们就用简单工厂类实现加减乘除的算法计算。首先定义一个运算的接口。

public interface operation {

    public double getresult();

}

定义好接口后,我们需要实现该接口,目前只实现加减乘除,所以需要四个实现类,在实现实现类之前,我们实现一个骨架抽象类,为了更灵活使用。

设计模式(一):简单工厂模式
public abstract class abstractoper implements operation{

    protected double numa;
    protected double numb;

    protected abstractoper(double numa, double numb) {
        this.numa = numa;
        this.numb = numb;
    }
    //运算抽象类
    protected abstract double oper();
    //实现接口的获取运算结果的方法
    public double getresult() {
        return oper();
    }
}
view code

然后开始编写实现类,首先加法运算实现类

public class addoperation extends abstractoper implements operation {


    public addoperation(double numa, double numb) {
        super(numa, numb);
    }

    @override
    protected double oper() {
        return numa+numb;
    }
}

减法实现类

public class suboperation extends abstractoper implements operation {
    public suboperation(double numa, double numb) {
        super(numa, numb);
    }

    @override
    protected double oper() {
        return numa-numb;
    }
}

乘法实现类

public class muloperation extends abstractoper implements operation {
    public muloperation(double numa, double numb) {
        super(numa, numb);
    }

    @override
    protected double oper() {
        return bigdecimal.valueof(numa).multiply(bigdecimal.valueof(numa)).doublevalue();
    }
}

除法实现类,这里要注意除数不为0问题

public class divoperation extends abstractoper implements operation {
    public divoperation(double numa, double numb) {
        super(numa, numb);
    }

    @override
    protected double oper(){
        try {
            if(numb==0){
                throw new exception("除数不能为0");//这里抛出异常
            }
        }catch (exception e){
            system.out.println("除数不能为0");//我这为了方便就直接捕获了,可以直接抛出
            return 0;
        }
        return bigdecimal.valueof(numa).divide(bigdecimal.valueof(numb)).doublevalue();
    }
}

当四个算法运算类实现好,为了能够方便具体实现哪一个类,所以建立一个工厂类

设计模式(一):简单工厂模式
public class operationfactory {

    public static operation createoperation(string oper, double numa, double numb){
        operation operation = null;
        switch (oper){
            case "+" :{
                operation = new addoperation(numa,numb);
                break;
            }
            case "-" :{
                operation = new suboperation(numa,numb);
                break;
            }
            case "*" :{
                operation = new muloperation(numa,numb);
                break;
            }
            case "/" :{
                operation = new divoperation(numa,numb);
                break;
            }

            default:{
                break;
            }
        }

        return operation;
    }
}
view code

最后只要在客户端调用工厂类即可创建具体实例,否在全在客户端实现比较混乱也不利于维护

设计模式(一):简单工厂模式
public class opertest {
    public static void main(string[] args) {
        system.out.print("输入numa:");
        scanner scan = new scanner(system.in);
        string reada = scan.nextline();
        double numa = double.parsedouble(reada);
        system.out.print("输入numb:");
        string readb = scan.nextline();
        double numb = double.parsedouble(readb);
        system.out.print("输入oper:");
        string operstr = scan.nextline();
        //调用工厂类创建实例
        operation oper = operationfactory.createoperation(operstr,numa,numb);
        //调用获取结果的方法
        double reslut = oper.getresult();
        system.out.println("输入numa:"+numa+"输入numb:"+numb+"输出结果:"+reslut);
    }
}
view code

总结


最终通过简单工厂实现了减加乘除得运算,好的程序离不开好的设计,虽然一个类也许就可以实现这泄功能,但那只是面向过程而非面向对象,通过以上写法用来满足类的单一原则,里氏原则,开闭原则,接口隔离,最少知道原则,以更好地实现松耦合。