大话设计模式读书笔记(一)

来源:互联网 发布:淘宝怎么开微淘 编辑:程序博客网 时间:2024/05/18 16:54

简单的工厂模式

Why

假设,我们需要设计一个计算器以实现加减运算功能。那么,我们当然可以把这个计算器设计成一个class:

    class Calculator {        public int calc(int A, int B, char op) {            if (op == '+') {                return A + B;            }            if (op == '-') {                return A - B;            }        }

但是,问题出现了:

  1. Calculator类应该实现两个独立的业务:界面和计算。这里只有一个业务,所以应该命名为Operation
  2. 程序没有任何的封装:不管我要加入其它任何的操作,比如乘除法,我都需要看原来的代码,也就是calc method。很多时候已经实现的操作是不能让看到的(比如该方法包含敏感操作或者敏感信息)。
  3. 程序缺乏扩展性和灵活性:每次新加入其它操作,所有代码都要重新编译以实现扩展。

为了实现封装和扩展性,我们可以用子类来继承Operation这个抽象类:

public abstract class Operation {    private int A;    private int B;    // ignore getter and setter for A and B    public int getResult() {        return 0;    }}
public class Add extends Operation {    @Override    public int getResult() {        return super.getA() + super.getB();    }}

到此,Java的三大特性基本上都实现了,但是,每当Operation调用的时候,怎么确定是Add还是Subtract被调用了呢?换句话说,到底该实例化哪个class呢?

What

一个工厂是一个class,它可以根据输入来决定实例化哪个它所对应的class。可以把这个class放到客户端让客户端以此来调用相应的方法。注意,客户端不需要知道Operation class的具体实现,但是需要知道Operation class有哪些继承的子类可供调用。

How

public class OperationFactory {    public static Operation createOperation(char operator) {        Operation op = null;        switch(operator) {            case '+':                op = new Add();                break;            case '-':                op = new Subtract();                break;              }        return op;    }}

Where

这种设计模式其实应用的范围非常广泛,比如,在JDBC里面的sessionfactory。

Result

利用工厂来实例化相应的class可以使得应用所需实例化的class数目达到最少从而实现不增加冗余代码和运行负载的功能。

0 0
原创粉丝点击