zoukankan      html  css  js  c++  java
  • 设计模式之工厂方法模式

       今天杨哥给小伙伴们带来了工厂方法设计模式,那么小伙们就有一个疑问了,工厂方法设计模式和之前杨哥所讲的工厂模式有何区别呢,是不是同一个呢,现在杨哥为小伙们解答这个疑问,先上两个图:

    第一个图是工厂模式UML类图

           

    第二个图是工厂方法UML类图:

               根据两幅图所示,工厂方法多了几个具体的工厂类。其实之前的工厂模式最大的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了具体的产品(加法类或其它类)的依赖。只要把"+"传给工厂类,工厂自动返回相应的实例做不同的运算功能。但问题也就在这里,如果想再加上一种运算方式,那就要去修改工厂类,需求的变化会去修改原来的类,这实在不太好,不灵活,违背了程序设计中的开放-封闭原则。所以呢,工厂方法设计模式应运而生啊,杨哥先上代码再说:

       

    运算类

    package factorymethod_designmode;

    //运算类

    public class Operation {

    public double get_numberA() {

    return _numberA;

    }

    public void set_numberA(double _numberA) {

    this._numberA = _numberA;

    }

    public double get_numberB() {

    return _numberB;

    }

    public void set_numberB(double _numberB) {

    this._numberB = _numberB;

    }

    private double _numberA = 0;

        private double _numberB = 0;

        

        

        /// 得到运算结果

        public  double getResult()

        {

            double result = 0; 

            return result;

        }

    }

    几种具体的计算类

        /// <summary>

        /// 加法类

        /// </summary>

        class OperationAdd extends Operation

        {

             public double getResult()

            {

                double result = 0; 

                result = get_numberA() + get_numberB();

                return result;

            }

        }

        /// <summary>

        /// 减法类

        /// </summary>

        class OperationSub extends Operation

        {

           public  double getResult()

            {

                double result = 0;

                result = get_numberA() - get_numberB();

                return result;

            }

        }

        /// <summary>

        /// 乘法类

        /// </summary>

        class OperationMul extends Operation

        {

            public  double getResult()

            {

                double result = 0;

                result = get_numberA() * get_numberB();

                return result;

            }

        }

        /// <summary>

        /// 除法类

        /// </summary>

        class OperationDiv extends Operation

        {

            public  double getResult()

            {

                double result = 0;

                if (get_numberB()==0)

    try {

    throw new Exception("除数不能为0。");

    } catch (Exception e) {

    // TODO 自动生成的 catch 块

    e.printStackTrace();

    }

                result = get_numberA() / get_numberB();

                return result;

            }

        }

    工厂方法接口

    package factorymethod_designmode;

    //工厂方法

    public interface IFactory {

     Operation CreateOperation();

    }

    几个具体的工厂类

     // 专门负责生产“+”的工厂

        class AddFactory implements IFactory

        {

            public Operation CreateOperation()

            {

                return new OperationAdd();

            }

        }

        

        // 专门负责生产“-”的工厂

        class SubFactory implements IFactory

        {

            public Operation CreateOperation()

            {

                return new OperationSub();

            }

        }

        // 专门负责生产“*”的工厂

        class MulFactory implements IFactory

        {

            public Operation CreateOperation()

            {

                return new OperationMul();

            }

        }

        // 专门负责生产“/”的工厂

        class DivFactory implements IFactory

        {

            public Operation CreateOperation()

            {

                return new OperationDiv();

            }

        }

    程序的入口:

            其实啊杨哥要告诉小伙伴的是工厂方法设计模式定义了一个用于创建对象的接口,让子类决定实例化哪一个具体的类,工厂方法使一个类的实例化延迟到其子类。如图诠释

          

    杨哥讲工厂方法设计模式就这么简单易懂,呵呵,觉得杨哥说的有道理的小伙们可以给杨哥点个赞,说个评论哦。

  • 相关阅读:
    JS 实现页面跳转
    JavaScript 获取指定的cookie值
    Jquery为单选框checkbox绑定单击事件
    “25岁博导”是“破五唯”的 正面榜样 还是 反面教材 ???
    国产软件如何让人再次失望——!20824 mindspore1.3.0gpu version can not compile from source code, because openmpi source code has bug
    sqlserver触发器引起的死锁问题
    Oracle客户端tnsnames.ora连接配置
    win7 调整C盘大小,不使用PQ
    C# 适合vs 2008和vs 2010的变量高亮highlight工具
    C# Response.Redirect引起的错误
  • 原文地址:https://www.cnblogs.com/xinanheishao/p/6984602.html
Copyright © 2011-2022 走看看