工厂方法模式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;
        }
    }

 

 

 

 

 

转载于:https://www.cnblogs.com/lmfeng/archive/2012/07/23/2604454.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值