面向对象编程设计模式------工厂模式(简单工厂、工厂方法、抽象工厂)

1、简单工厂模式

  简单工厂模式又叫静态工厂方法模式(Static Factory Method Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
  一个简单的实例:要求实现一个计算机控制台程序,要求输入数的运算结果。最原始的解决方法如下:

/**
 * @Description:这里使用的是最基本的实现,并没有体现出面向对象的编程思想,代码的扩展性差,甚至连除数可能为0的情况也没有考虑
 */
public static void main(String[] args) {
   
    scanner = new Scanner(System.in);
    
    System.out.print("请输入第一个数字:");
    int firstNum = scanner.nextInt();
    
    System.out.print("请输入第二个数字:");
    int secondNum = scanner.nextInt();
    
    System.out.print("请输入运算符:");
    String operation = scanner.next();
    
    if(operation.equals("+")) {
   
        System.out.println("result:" + (firstNum + secondNum));
    } else if(operation.equals("-")) {
   
        System.out.println("result:" + (firstNum - secondNum));
    } else if(operation.equals("*")) {
   
        System.out.println("result:" + (firstNum * secondNum));
    } else if(operation.equals("/")){
   
        System.out.println("result:" + (firstNum / secondNum));
    }
}

  上面的写法实现虽然简单,但是却没有面向对象的特性,代码拓展性差,甚至没有考虑除数可能为0的特殊情况。
  在面向对象编程语言中,一切都是对象,所以上面运算符号也应当作对象来处理。因此我们首先建立一个运算接口,所有其他的运算都封装成类,并实现该运算接口。

/**
 * @Description: 定义一个运算接口,将所有的运算符号都封装成类,并实现本接口
 * @author: zxt
 * @time: 2018年7月6日 上午10:24:13
 */
public interface Operation {
   
    public double getResult(double firstNum, double secondNum);
}

public class AddOperation implements Operation {
   
    @Override
    public double getResult(double firstNum, double secondNum) {
   
        return firstNum + secondNum;
    }
}

public class SubOperation implements Operation {
   
    @Override
    public double getResult(double firstNum, double secondNum) {
   
        return firstNum - secondNum;
    }
}

public class MulOperation implements Operation {
   
    @Override
    public double getResult(double firstNum, double secondNum) {
   
        return firstNum * secondNum;
    }
}

public class DivOperation implements Operation {
   
    @Override
    public double getResult(double firstNum, double secondNum) {
   
        if(secondNum == 0) {
   
            try {
   
                throw new Exception("除数不能为0!");
            } catch (Exception e) {
   
                e.printStackTrace();
            }
        }
        
        return firstNum / secondNum;
    }
}

  现在的问题的是,如何根据不同的情况创建不同的对象,这里就可以使用简单工厂模式来实现了,客户端只需要提供运算符,工厂类会判断并生成相应的运算类:

/**
 * @Description: 简单工厂模式:通过一个工厂类,根据情况创建不同的对象
 * @author: zxt
 * @time: 2018年7月6日 上午10:50:15
 */
public class OperationFactory {
   
    /**
     * @Description:根据运算符得到具体的运算类
     * @param operationStr
     */
    public static Operation getOperation(String operationStr) {
   
        Operation result = null;
        
        switch(operationStr) {
   
        case "+":
            resu
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值