读前辈的大话设计模式(一)之简单工厂模式,抒自己的读后感

       由于作者是Java语言的追随者,所以本文的设计模式实现用的是Java语言,不过正如书中前辈所述,面向对象的语言实质上大同小异,所以将实现换为其他面向对象语言(c#、c++)也不难。由于作者水平有限,望读者海涵。

      

      番外篇:命名遵循【见名知意】,当我们刚开始学习时,由于用的 类,变量,方法等数量都比较少,所以常常会很随意就命名,例如 public class A{},public int B = 0;,public void C(){},这些暂时看起来并不影响代码编译,功能实现也很OK,但其实是有问题的,因为这不能做到一个很基本的准则:见名知意,开发规范里,这一条是最最基本的了。这里多说几句,既然大家都用的是英文环境代码,就尽量使用英文命名,汉语拼音式命名只是部分人看懂(如果是外资项目,老外看到了其实和A,B,C命名并没区别),所以掌握基本的开发的英文词汇(为什么说是基本,因为英语也是多词一意,我们要用常用的,不要用为了装那个,用一些生僻词汇)也是必备技能。

  

     正文篇:面向对象思想实现:

           业务封装:让业务逻辑与界面逻辑分开,让他们的耦合度下降,达到易于维护和扩展的目的。

          本文套用书中设计计算器的方式来实现。

          1、定义变量起始类:         

package operation;

import lombok.Getter;
import lombok.Setter;

/**
 * Created by Administrator on 2017/8/1.
 */

/**
 * 这里利用 lombok 插件产生 get、set 方法,作用是减少手动生成get、set 方法,
 * 关于 lombok 插件的使用,请自己手动查阅相关资料
 */
@Getter
@Setter
public abstract class Operation {

    private double numberA;

    private double numberB;

    public abstract double getResult();

}

          2、 分别定义加减乘除四个类:

         加法类:

扫描二维码关注公众号,回复: 2454793 查看本文章

package entity;

import operation.Operation;

/**
 * Created by Administrator on 2017/8/1.
 */
public class OperationAdd extends Operation {

    @Override
    public double getResult() {
        double result;
        result = super.getNumberA() + super.getNumberB();
        return  result;
    }
}

     减法类:

package entity;

import operation.Operation;

/**
 * Created by Administrator on 2017/8/1.
 */
public class OperationSub extends Operation {

    @Override
    public double getResult() {
        double result;
        result = super.getNumberA() - super.getNumberB();
        return  result;
    }
}

     乘法类:

package entity;

import operation.Operation;

/**
 * Created by Administrator on 2017/8/1.
 */
public class OperationMul extends Operation {

    @Override
    public double getResult() {
        double result;
        result = super.getNumberA() * super.getNumberB();
        return  result;
    }
}

    除法类:

package entity;

import operation.Operation;

/**
 * Created by Administrator on 2017/8/1.
 */
public class OperationDiv extends Operation {

    @Override
    public double getResult() {
        double result =0;
        if (0 != super.getNumberB()) {
            result = super.getNumberA() / super.getNumberB();
        }else {
            throw new ArithmeticException("除数不能为 0");
        }
        return  result;
    }
}


     3、定义运算操作类:

package controller;

import entity.OperationAdd;
import entity.OperationDiv;
import entity.OperationMul;
import entity.OperationSub;
import operation.Operation;

/**
 * Created by Administrator on 2017/8/1.
 */
public class OperationFactory{

    public static Operation createOperate(char operate){
        Operation operation = null;

        switch (operate){

            case '+':
                operation = new OperationAdd();
                break;

            case '-':
                operation = new OperationSub();
                break;

            case '*':
                operation = new OperationMul();
                break;

            case '/':
                operation = new OperationDiv();
                break;

        }
        return operation;
    }
}

    4、定义测试类:

import controller.OperationFactory;
import operation.Operation;
import org.junit.Test;

/**
 * Created by Administrator on 2017/8/1.
 */

public class TestOperation {

    @Test
    public void testOperation(){
        Operation operation ;
        operation = OperationFactory.createOperate('+');
        operation.setNumberA(5);
        operation.setNumberB(3);

        double result = operation.getResult();
        System.out.println(result);
    }
}

这样如果我们想要增加相应的功能,比如开方,求对数,正余弦之类的时候,只要在entity包下增加相应的实体类,然后在操作类中switch...case增加相应的分支配置就OK。这样就达到了增减功能不影响其他功能的效果。好了,简单工厂模式到此结束。

猜你喜欢

转载自blog.csdn.net/medier/article/details/76502442