zoukankan      html  css  js  c++  java
  • 学习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类中

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

  • 相关阅读:
    gulp+browser-sync使用方法
    小程序试用体验
    移动端调试总结
    函数防抖和函数分流
    页面返回顶部的方法总结
    POJ
    POJ
    UVA 10129 Play on Words(欧拉道路)
    UVA 10305 Ordering Tasks (拓扑排序)
    UVA 12657 Boxes in a Line(双向链表+小技巧)
  • 原文地址:https://www.cnblogs.com/hbxblogs/p/2947560.html
Copyright © 2011-2022 走看看