设计模式之简单工厂

1简单工厂

1.1简单工厂定义

提供创建对象的接口.简单工厂不属于23种设计模式里的

1.2UML类图

在这里插入图片描述

1.3简单工厂的使用场景

再不确定会有多少个处理操作时应该考虑使用简单工厂模式,如针对同样的接收到的数据,处理的逻辑可能会不同,可能以后还会增加新的操作。

例如如果实现计算器的功能时,对于同样的输入数据,可能执行加、减、乘、除,甚至其他的功能。因此可以抽象出一个操作的抽象类或是接口,提供一个统一的处理方法(此处为process),然后每种操作创建出一个子类出来。而判断具体使用哪个具体的实现类是在工厂类中进行判断的(将存放操作的变量传递给工厂的生产方法)。工厂类始终返回的是这个抽象类,这样如果对原有功能进行更改或是新添加新的功能,也不会对原来的其他类做修改,只编译修改的那个类或是新的类就可以了。
这样就做到了把耦合降到最低,同时也便于维护。

1.4案例(计算器)

1.4.1实现一个面向过程的计算器

package my.simpleFactor.v1;

import java.util.Scanner;

/** 写一个加减乘除计算器.面向过程写法
 * @Description
 * @Author fanjia
 * @Version V1.0.0
 * @Since 1.0
 * @Date 2020/6/18
 */
public class main {
    public static void main(String[] args) {
        System.out.println("请输入数字A");
        Scanner input=new Scanner(System.in);
        String numAStr = input.next();
        Integer numA = Integer.valueOf(numAStr);
        System.out.println("请输入运算符");
        String strOperate = input.next();
        System.out.println("请输入数字B");
        String numBStr = input.next();
        Integer numb = Integer.valueOf(numBStr);
        String total= "";
        switch (strOperate){
            case "+":
                total=numA+numb+"";
            break;
                    case "-":
                total=numA-numb+"";
            break;
                case "*":
                total=numA*numb+"";
            break;
                case "/":
                total=numA/numb+"";
                break;
                default:
                    break;
        }
        System.out.println("结果"+total);
    }

}

1.4.2实现一个面向对象的计算器(封装)

抽出一个算法类

package my.simpleFactor.v2;

/** 运算类
 * @Description
 * @Author fanjia
 * @Version V1.0.0
 * @Since 1.0
 * @Date 2020/6/18
 */
public class Operation {

    public static String getResutl(int numA,int numb,String operation){
       String total="";
        switch (operation){
            case "+":
                total=numA+numb+"";
                break;
            case "-":
                total=numA-numb+"";
                break;
            case "*":
                total=numA*numb+"";
                break;
            case "/":
                total=numA/numb+"";
                break;
            default:
                break;
        }

        return total;
    }





}

package my.simpleFactor.v2;

import java.util.Scanner;

/** 面向对象_1之继承解决面向过程
 * @Description
 * @Author fanjia
 * @Version V1.0.0
 * @Since 1.0
 * @Date 2020/6/18
 */
public class main {
    public static void main(String[] args){
        System.out.println("请输入数字A");
        Scanner input=new Scanner(System.in);
        String numAStr = input.next();
        Integer numA = Integer.valueOf(numAStr);
        System.out.println("请输入运算符");
        String strOperate = input.next();
        System.out.println("请输入数字B");
        String numBStr = input.next();
        Integer numb = Integer.valueOf(numBStr);
        String resutl = Operation.getResutl(numA, numb, strOperate);
        System.out.println("最终结果"+resutl);
    }
}

优点:面向对象 这样的做法成功将业务和界面(控制台)解耦
缺点 面向对象的作用还没实现最大功力.这样的做法 如果以后需要增加新的算法 开更 平方计算 需要去修改Operation 违反开闭原则. 紧耦合

1.4.3实现一个面向对象的计算器(封装+继承)

通过分析上面的缺点.我们可以将算法变成一个接口 或者通过集成的形式.这里采用继承的形式
算法父类

package my.simpleFactor.v3;

/**  定义一个算法抽象类
 * Created by Administrator on 2020/6/18.
 */
public abstract class Operation {

    public abstract String getResutl(int numA, int numb);

}


创建加法类继承算法类

package my.simpleFactor.v3;

/** 加法类
 * @Description
 * @Author fanjia
 * @Version V1.0.0
 * @Since 1.0
 * @Date 2020/6/18
 */
public class AddOperation extends Operation {

    public String getResutl(int numA, int numb) {

        return  numA+numb+"";
    }
}

创建减法类 继承算法类

package my.simpleFactor.v3;

/** 减法类
 * @Description
 * @Author fanjia
 * @Version V1.0.0
 * @Since 1.0
 * @Date 2020/6/18
 */
public class SubOperation extends Operation {

    public String getResutl(int numA, int numb) {
        return numA-numb+"";
    }
}

乘法

package my.simpleFactor.v3;

/** 乘法类
 * @Description
 * @Author fanjia
 * @Version V1.0.0
 * @Since 1.0
 * @Date 2020/6/18
 */
public class MulOperation extends Operation {

    public String getResutl(int numA, int numb) {

        return numA*numb+"";
    }
}

package my.simpleFactor.v3;

/** 除法类
 * @Description
 * @Author fanjia
 * @Version V1.0.0
 * @Since 1.0
 * @Date 2020/6/18
 */
public class DivOperation extends Operation {

    public String getResutl(int numA, int numb) {
        return numA/numb+"";
    }
}

优点上面将方法具体实现到具体的类里面了.所以一旦增加新算法只需要继承这个算法父类 实现算法方法即可
问题:如何让计算器知道我们要实现的是哪个算法类(利用简单工厂实例化)

1.4.3实现一个面向对象的计算器(简单工厂)(这里面包含了(封装+继承+多肽)的思想)

package my.simpleFactor.v3;

/**
 * @Description
 * @Author fanjia
 * @Version V1.0.0
 * @Since 1.0
 * @Date 2020/6/18
 */
public class OperationFactory {

    public static Operation createOperation(String operation){
        Operation o=null;
        switch (operation){
            case "+":
               o=new AddOperation();
                break;
            case "-":
                o=new SubOperation();
                break;
            case "*":
                o=new MulOperation();
                break;
            case "/":
                o=new DivOperation();
                break;
            default:
                break;
        }
    return o;
    }
}

package my.simpleFactor.v3;

/**
 * @Description
 * @Author fanjia
 * @Version V1.0.0
 * @Since 1.0
 * @Date 2020/6/18
 */
public class main {
    public static void main(String[] args) {
        Operation operation = OperationFactory.createOperation("+");

        System.out.println(operation.getResutl(1,2));
    }
}

在这里插入图片描述
这样做已经完成了简单工厂

1.5简单工厂优缺点

优点业务和逻辑分离.将创建什么类的逻辑转移到了简单工厂里.
缺点:开闭原则还是没解决.以后有新的方法 还是要去简单工厂类修改代码.
(这就有了工厂方法模式)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值