zoukankan      html  css  js  c++  java
  • 工厂方法模式VS简单工厂模式

    工厂方法模式VS简单工厂模式
    简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关类对于客户端来说,去除了与具体产品的依赖。工厂方法模式:定义了一个用于创建对象接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。工厂方法模式实现时,客户端需要决定实例化哪一个工厂类来实现运算类,选择判断的问题还是存在,也就是说,工厂方法把简单工厂内容判断移到了客户端来判断。简单工厂主要的缺点是违背的开放-封闭原则。

    工厂方法模式结构图:

    工厂方法模式UML图
     调用模式的客户端代码:
       class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("请输入数字A:");
                string A = Console.ReadLine();
                Console.WriteLine("请输入操作符(+、-、*、/):");
                string opration = Console.ReadLine();
                Console.WriteLine("请输入数字B:");
                string B = Console.ReadLine();
                float result = 0;
                try
                {
                    Opration oper;
                    //调用简单工厂
                    oper = OprationFactory.CreateOpration(opration);//具体需要实例化的类在简单工厂类里面确定
                    oper.A = float.Parse(A);
                    oper.B = float.Parse(B);
                    result = oper.GetResult();
                    Console.WriteLine("结果是:" + result.ToString());

                    //调用工厂方法模式
                    IFactory op = new AddFactory();//具体需要实例化的类在客户端就确定了
                    Opration operadd = op.CreateOpration();
                    operadd.A = 1;
                    operadd.B = 1;
                    result = operadd.GetResult();
                    Console.WriteLine("结果是:" + result.ToString());
                    
                }
                catch (Exception ex)
                {
                    Console.WriteLine("您输入有误:" + ex.Message);
                }
                Console.ReadKey();
            }
        }
    IFactory接口:
        interface IFactory
        {
            Opration CreateOpration();
        }
     

     具体的工厂类继承IFactory接口:

        class AddFactory : IFactory
        {
            public Opration CreateOpration()
            {
                return new AddOpration();
            }
        }

    具体的运算类实现:

        public class AddOpration : Opration
        {
            public override float GetResult()
            {
                float result = 0;
                result = A + B;
                return result;
            }
        }

    Opration类实现:
        public class Opration
        {
            public float A { get; set; }

            public float B { get; set; }


            public virtual float GetResult()
            {
                return 0;
            }
        }

    如果是简单工厂,那简单工厂类的实现:

        public class OprationFactory
        {
            public static Opration CreateOpration(string vopration)
            {
                Opration oper = null;
                switch (vopration)
                {
                    case "+":
                        oper = new AddOpration();
                        break;

                    case "-":
                        oper = new SubOpration();
                        break;

                    case "*":
                        oper = new MulOpration();
                        break;

                    case "/":
                        oper = new DivOpration();
                        break;
                }
                return oper;
            }
        }

  • 相关阅读:
    带轮播图、导航栏、商品的简单html,以及轮播图下边数字随轮播图的改变而改变
    设计table表格,用js设计偶数行和奇数行显示不同的颜色
    用js实现九九乘法口诀两种方式
    [FW]修复ubutnu12.04+win7的grub2引导
    How to compile Linux kernel in fedora 6
    [Fw]初探linux中断系统(2)
    [Fw]初探linux中断系统(1)
    Regular Expression 範例
    [fw]IDT表的初始化
    [Fw]中断的初始化
  • 原文地址:https://www.cnblogs.com/lmfeng/p/2604454.html
Copyright © 2011-2022 走看看