大话设计模式读后感之工厂模式

来源:互联网 发布:c语言输入输出 编辑:程序博客网 时间:2024/06/06 06:34

一、面向对象思维(OOP)

何为面向对象,我举个例子:在北宋前,人们每当要复印新东西,都需要从新雕刻。当活字印刷术出现后,就省事多了。

活字印刷术作为对象具有属性和方法

1、封装:用的人不需要会雕刻只要认字就行了(便维护)。

2、继承:如果有缺少的字,只需要增加(可扩展)。

3、多态:可以应付各种印刷问题(可复用)。

那么我们使用活字印刷术不就是面向对象了么。

二、简单工厂模式

按照我们对之前面向对象思想的理解,那么我们要提高程序的可维护 、可复用、可扩展。

以实现简单计算器为

将一个简单的功能划分为 业务类、工厂类、逻辑类、磨具类

业务类:

public static void main(String[] args) {Scanner scanner=new Scanner(System.in);Model model=new Model();//引入磨具try {System.out.println("请输入数字A");model.setNumberA(scanner.nextLine());System.out.println("请输入运算符");model.setProcess(scanner.nextLine());System.out.println("请输入数字B");model.setNumberB(scanner.nextLine());FactoryDao dao=new FactoryDao();Model result=dao.operation(model);//工厂加工后的成品System.err.println(result.toString());}  catch (IllegalArgumentException e) {// TODO: handle exceptionSystem.out.println("错误!非法参数!");}}

工厂:流水线加工在这里我们使用switch作为逻辑判断

public class FactoryDao  {private AlgorithmDao algorithmDao=new AlgorithmDaoImpl();public Model operation(Model model){switch (model.getProcess()) {case "+":model.setResult(algorithmDao.sum(model.getNumberA(), model.getNumberB()));break;case "-":model.setResult(algorithmDao.reduce(model.getNumberA(), model.getNumberB()));break;case "*":model.setResult(algorithmDao.multiplication(model.getNumberA(), model.getNumberB()));break;case "/":model.setResult(algorithmDao.division(model.getNumberA(), model.getNumberB()));break;default:model.setResult("没有找到"+model.getProcess()+"运算符");break;}return model;}}
逻辑处理类声明

public interface AlgorithmDao {public String sum(Double a,Double b);public String reduce(Double a,Double b);public String multiplication(Double a,Double b);public String division(Double a,Double b);}
逻辑处理类实现

public class AlgorithmDaoImpl implements AlgorithmDao{public String sum(Double a, Double b) {// TODO 自动生成的方法存根return String.valueOf(a+b);}public String reduce(Double a, Double b) {// TODO 自动生成的方法存根return String.valueOf(a-b);}public String multiplication(Double a, Double b) {// TODO 自动生成的方法存根return String.valueOf(a*b);}public String division(Double a, Double b) {// TODO 自动生成的方法存根try{if(b==0)throw new IllegalArgumentException();}catch(IllegalArgumentException ex){return "除数不能为0!";}return String.valueOf(a/b);}}
磨具类//这里我进行了类型转换,如果失败会抛出非法字符异常(该异常为运行异常),并在业务类捕获这个异常。
public class Model {private Double NumberA;private Double NumberB;private String Process;private String Result;public Double getNumberA() {return NumberA;}public void setNumberA(String numberA) {NumberA = Double.valueOf(numberA);}public Double getNumberB() {return NumberB;}public void setNumberB(String numberB) {NumberB =Double.valueOf(numberB);}public String getProcess() {return Process;}public void setProcess(String process) {Process = process;}public String getResult() {return Result;}public void setResult(String result) {Result = result;}public String toString(){return NumberA+Process+NumberB+"="+Result;}}

以上就是简单工厂模式设计