Simple Factory简单工厂模式

来源:互联网 发布:云南白药牙膏 知乎 编辑:程序博客网 时间:2024/05/19 19:30
Simple Factory模式根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个公共的父类和公共的方法当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。  同时,系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂。

namespace SimplyFactory{    class Program    {        public static void Main()        {            ProductSimpleFactory ps = new ProductSimpleFactory();            Product pro1 = ps.CreateProduct("TVA");            pro1.Create();            Product pro2 = ps.CreateProduct("TVB");            pro2.Create();            Product pro3 = ps.CreateProduct("TVC");            pro3.Create();            Console.ReadKey();        }    }    //简单工厂模式:工厂类Creator:创建产品对象、产品抽象类Product、具体产品类ConcreteProduct    public abstract class Product//产品抽象类    {        public abstract void Create();    }    public class TVA : Product    {        public override void Create()        {            Console.WriteLine("Create a Product of TVA");        }    }    public class TVB : Product//具体产品    {        public override void Create()        {            Console.WriteLine("Create a Product of TVB");        }    }    public class TVC : Product    {        public override void Create()        {            Console.WriteLine("Create a Product of TVC");        }    }    public class ProductSimpleFactory//工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。    {        public Product CreateProduct(string pro)        {            switch (pro)            {                case "TVA":                    return new TVA();                                   case "TVB":                    return new TVB();                                    case "TVC":                    return new TVC();                                   default:                    return null;                               }        }    }}

工厂类角色Creator (ProductSimpleFactory):工厂类在客户端的直接控制下(Create方法)创建产品对象。 抽象产品角色Product ( Product):定义简单工厂创建的对象的父类或它们共同拥有的接口。可以是一个类、抽象类或接口。 具体产品角色ConcreteProduct (TVA,TVB,TVC):定义工厂具体加工出的对象


面向对象的编程,并不是类越多越好

举例:简单工厂类实现计算器的简单运算

产生简单工厂类

    public class OperateFactory    {        public static Operate CreateOperate(string operate)        {            Operate oper= null;            switch(operate)            {                case "+":                    oper = new OperateAdd();                    break;                case "-":                    oper = new OperateMinus();                    break;                case "*":                    oper = new OperateMulti();                    break;                case "/":                    oper = new OperaterDiv();                    break;                default:                    break;            }            return oper;        }    }


简单工厂类

    public  abstract class Operate    {        private double numberA;        private double numberB;        public double NumberA        {            get { return numberA; }            set { numberA = value; }        }        public double NumberB        {            get { return numberB; }            set { numberB= value;  }        }        public virtual double GetResult()        {            double result = 0.0;            return result;        }            //若子类没有重写父类的虚方法,父类对象必须强制转换为子类,才可以调用子类的方法;        //若子类重写了父类的虚方法,则直接调用父类的方法即可。    }


加法类

   public class OperateAdd : Operate    {        public override double GetResult()        {            double result = 0;            result=NumberA+NumberB;            return result;        }    }


减法类

   public class OperateMinus : Operate    {        public override double GetResult()        {            double result = 0;            result = NumberA -NumberB;            return result;        }    }


乘法类

    public class OperateMulti : Operate    {        public override double GetResult()        {            double result = 0;            result = NumberA * NumberB;            return result;        }    }


除法类

    public class OperaterDiv : Operate    {        public override double GetResult()        {            double result = 0;            if(NumberB==0)            {                throw new Exception("Cannot div zero");            }            else            {                result = NumberA / NumberB;            }            return result;        }    }


用户

    class Program    {        static void Main(string[] args)        {            Operate op;            op = OperateFactory.CreateOperate("*");            op.NumberA = 10;            op.NumberB = 70;            Console.WriteLine("{0}",op.GetResult());            Console.Read();        }    }


..

原创粉丝点击