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

 

 

 

 

 

posted @ 2012-07-23 09:23  八神吻你  阅读(1990)  评论(1编辑  收藏  举报