学习23种设计模式之简单工厂模式

准备知识
在OO设计领域,我们知道前人总结了不少的经验,许多的经验在现代软件工程过程中已经被认为是原则来遵守。下面笔者摘抄几项下文涉及到的OO原则的定义。

OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭。我的理解是,对于一个已有的软件,如果需要扩展,应当在不需修改已有代码的基础上进。

DIP(依赖倒转原则,Dependence Inversion Principle):要针对接口编程,不要针对实现编程。我的理解是,对于不同层次的编程,高层次暴露给低层次的应当只是接口,而不是它的具体类。

LoD(迪米特法则,Law of Demeter):只与你直接的朋友通信,而避免和陌生人通信。众所周知类(或模块)之间的通信越少,耦合度就越低,从而更有利于我们对软件的宏观管理。老子论“圣人之治”有相同的思想,《老子》云:“是以圣人之治,虚其心,实其腹,弱其志,常使民无知无欲。”,又云:“小国寡民,邻国相望,鸡犬之声相闻,民至老死,不相往来。”。佩服我们的老祖宗,N千年前就想到了西方N千年后才想到的东西,同时也佩服《java与模式》的作者阎宏,可以用中国传统哲学思想这么生动的说明这一软件设计原则。

 

以一个计算器功能的程序为例

 Operation类,这个类为计算器所有操作的父类。

public abstract class Operation {

    private double numberA;
    private double numberB;
//抽象具体实现方法,让子类实现
public abstract double getResult(); public double getNumberA() { return numberA; } public void setNumberA(double numberA) { this.numberA = numberA; } public double getNumberB() { return numberB; } public void setNumberB(double numberB) { this.numberB = numberB; } }

 

OperationAdd类,继承Operation类,实现加法操作

public class OperationAdd extends Operation{

    /**
     * 加法操作
     */
    @Override
    public double getResult() {
        return super.getNumberA() + super.getNumberB();
    }

}

 

OperationSub类,继承Operation类,实现减法操作

public class OperationAdd extends Operation{

    /**
     * 加法操作
     */
    @Override
    public double getResult() {
        return super.getNumberA() + super.getNumberB();
    }

}

 

OperationFactory类,这个类生产需要的Operation子类。

public class OperationFactory {

    public static Operation createOperation(char operation){
        Operation oper = null;
        
        switch(operation){
        case '+':
            oper = new OperationAdd();
            break;
        case '-':
            oper = new OperationSub();
            break;
        case '*':
            oper = new OperationMul();
            break;
        case '/':
            oper = new OperationDiv();
            break;
        }
        
        return oper;
    }
}

 

 

一个简单的计算器小程序,运用到了面向对象的继承、封装、多态。这个简单工厂模式大大增加了程序的灵活性和扩展性,如果我还要添加开根操作,只需要继承Operation类实现开根操作,再在OperationFactory类中

加一个开根的判断就行了,无需修改原来的代码。

posted @ 2013-03-07 10:36  左眼跳跳  阅读(585)  评论(0编辑  收藏  举报