《大话设计模式》--雷锋依然在人间--工厂方法模式<Factory Method>(8)

来源:互联网 发布:如何看待网络暴力演讲 编辑:程序博客网 时间:2024/05/18 23:54

简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖

FM:定义了用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

计算器的工厂方法模式UML:

代码如下:

interface IFactory    {        Operation CreateOperation();    }

 

public class Operation    {        public double Num1        {            get;            set;        }        public double Num2        {            get;            set;        }        public virtual double Operate()        {            double result = 0d;            return result;        }    }

 

class OperationAdd : Operation    {        public override double Operate()        {            double result = 0d;            result = Num1 + Num2;            return result;        }    }

 

class OperationSubtract:Operation    {        public override double Operate()        {            double result = 0d;            result = Num1 - Num2;            return result;        }    }

 

class OperationMultiply:Operation    {        public override double Operate()        {            double result = 0d;            result = Num1 * Num2;            return result;        }    }

 

class OperationDivide:Operation    {        public override double Operate()        {            double result = 0d;            if (Num2 != 0)            {                result = Num1 / Num2;            }            return result;        }    }


工厂方法模式:

class AddFactory:IFactory    {        public Operation CreateOperation()        {            return new OperationAdd();        }    }

 

class SubtractFactory:IFactory    {        public Operation CreateOperation()        {            return new OperationSubtract();        }    }

 

class MultiplyFactory:IFactory    {        public Operation CreateOperation()        {            return new OperationMultiply();        }    }

 

class DevideFactory:IFactory    {        public Operation CreateOperation()        {            return new OperationDivide();        }    }


客户端代码:

            IFactory ifactory = new AddFactory();            Operation ope = ifactory.CreateOperation();            ope.Num1 = 2;            ope.Num2 = 3;            double result = ope.Operate();            Console.WriteLine(result);

 

总结:工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。你想要加功能,本来是改工厂类,而现在是修改客户端。

 

雷锋工厂方法模式:

下面是UML图:

interface ILeiFengFactory    {        LeiFeng CreateLeiFeng();    }

 

class LeiFeng    {        public void Sweep()        {            Console.WriteLine("扫地");        }        public void Wash()        {            Console.WriteLine("洗衣");        }        public void BuyRice()        {            Console.WriteLine("买米");        }    }

 

class Undergraduate:LeiFeng    {           }

 

class Volunteer:LeiFeng    {    }

 

class UndergraduateFactory:ILeiFengFactory    {        public LeiFeng CreateLeiFeng()        {            return new Undergraduate();        }    }

 

class VolunteerFactory:ILeiFengFactory    {        public LeiFeng CreateLeiFeng()        {            return new Volunteer();        }    }


客户端代码:

            ILeiFengFactory factory = new UndergraduateFactory();            LeiFeng lf = factory.CreateLeiFeng();            lf.BuyRice();            lf.Sweep();            lf.Wash();
0 0