您的位置:首页 > 其它

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

2013-04-25 19:24 267 查看
准备知识
在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类中
加一个开根的判断就行了,无需修改原来的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: