您的位置:首页 > 其它

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

2016-07-10 14:47 363 查看

简单的工厂模式

Why

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

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


但是,问题出现了:

Calculator类应该实现两个独立的业务:界面和计算。这里只有一个业务,所以应该命名为Operation

程序没有任何的封装:不管我要加入其它任何的操作,比如乘除法,我都需要看原来的代码,也就是
calc
method。很多时候已经实现的操作是不能让看到的(比如该方法包含敏感操作或者敏感信息)。

程序缺乏扩展性和灵活性:每次新加入其它操作,所有代码都要重新编译以实现扩展。

为了实现封装和扩展性,我们可以用子类来继承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数目达到最少从而实现不增加冗余代码和运行负载的功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息