搞懂简单工厂模式的原理和实现

简单工厂模式:

简单工厂模式并不是23种设计模式之一,因为他并不符合开闭原则主要目的是为了设计模式入门以及工厂方法模式,适合产品子类比较少的,创建操作比较简单的情况。

简单工厂的关键点如下:

1.定义一个static方法
2.使用抽象父类/接口作为方法的返回值
3.传入一个参数(一般是字符串参数)
4.方法内部根据传入的参数创建某个子类对象

优点>
客户端不负责对象的创建,而是由专门的工厂类完成;
客户端只负责对象的调用,实现了创建和调用的分离,降低了客户端的代码难度;
缺点>
如果增加和减少产品子类,需要修改简单工厂类,违背了开闭原则
如果产品子类过多,会导致工厂类非常庞大,违反了高内聚原则,不利于后期维护(一个工厂创建所有的子类产品)
适用情况>
所有的产品子类都有同一个父类(或接口),属于同一个产品系列
产品子类比较少的、创建操作比较简单

具体实现:

抽象类:

public abstract class Calculator {

    protected int num1;//运算数1

    protected int num2;//运算数1

    //生成有参无参构造方法,getset方法
    public int getNum1() {
        return num1;
    }

    public void setNum1(int num1) {
        this.num1 = num1;
    }

    public int getNum2() {
        return num2;
    }

    public void setNum2(int num2) {
        this.num2 = num2;
    }

    public Calculator(int num1, int num2) {
        this.num1 = num1;
        this.num2 = num2;
    }
    public Calculator() {}

    /**
     * 不同的运算,运算规则不同
     * @return
     */
    public abstract int calc();

}

继承:

public class AddCalculator extends Calculator {
    public AddCalculator(int num1, int num2) {
        super(num1, num2);
    }

    public AddCalculator() {
    }

    public int calc() {
        return num1+num2;
    }
}

class SubtractCalculator extends Calculator {
    public SubtractCalculator(int num1, int num2) {
        super(num1, num2);
    }

    public SubtractCalculator() {
    }

    public int calc() {
        return num1-num2;
    }
}

class MultractCalculator extends Calculator {
    public MultractCalculator(int num1, int num2) {
        super(num1, num2);
    }

    public MultractCalculator() {
    }

    public int calc() {
        if(num2!=0){
            return num1*num2;
        }else{
            throw new RuntimeException("除数不能是0");
        }
    }
}

class DivideCalculator extends Calculator {
    public DivideCalculator(int num1, int num2) {
        super(num1, num2);
    }

    public DivideCalculator() {
    }

    public int calc() {
        return num1/num2;
    }
}

工厂类:

public class CalcFactory {
    public static Calculator getCalc(String type){
        if("+".equals(type)){
            return new AddCalculator();
        }else if("-".equals(type)){
            return new SubtractCalculator();
        }else if("*".equals(type)){
            return new MultractCalculator();
        }else if("/".equals(type)){
            return new DivideCalculator();
        }else{
            return null;
        }
    }
}

最后测试类:

public class CalculatorTest {
    public static void main(String[] args) {
        Calculator calculator = CalcFactory.getCalc("+");
        calculator.setNum1(10);
        calculator.setNum2(20);
        int result = calculator.calc();
        System.out.println(result);
    }
}
技术的升级迭代只是为了淘汰那些不学习的人!!!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值