简单工厂模式

来源:互联网 发布:强力删除软件下载 编辑:程序博客网 时间:2024/06/05 23:59

        “工厂”一词我想大家都耳熟能详,在现实生活中,工厂是负责生产产品的基地。那么,在设计模式有一种模式叫做“简单工厂模式”,通过对“工厂”一词的理解,这里的简单工厂模式可以理解为负责生产对象的一个类。

       在我们平常编程中,往往要在客户端用“New”实例化出类的一个对象。此时客户端直接依赖与这个对象,当需求发生变化时,我们不得不在客户端中修改代码。简单工厂的核心思想就是创建一个负责生产对象的工厂类,其中包含必要的逻辑判断,客户端中只通过传递参数就可以动态实例化出相关的对象。简单工厂很好解除了客户端与具体产品的直接依赖,转变成间接依赖。

      简单工厂的结构图

               

    简单工厂的实现方式

     作为学生,我们经常做的就是去食堂买饭,下面我就以这个情景为例子向大家介绍一下简单工厂的实现代码吧。
     首先,有很多主食,如米饭、面条、馒头等等,从米饭、面条这个具体的事物抽象出它们的父类Food类。
      
  class Food    {        public virtual void GetFood() //虚方法,在子类中实现。        {           }    }
    其次,就是子类,子类继承与父类,实现父类中定义的方法。
     
   class Rice : Food     //米饭类    {        public override void GetFood()        {            Console.WriteLine("您选择的主食是米饭!");        }    }    class Noodles : Food  //面条类    {        public override void GetFood()        {            Console.WriteLine("您选择的主食是面条!");        }    }    class Buns : Food   //馒头类    {        public override void GetFood()        {            Console.WriteLine("您选择的主食是馒头!");        }    }
     最后,定义工厂类,工厂类中包含必要的逻辑判断,根据选择产品类的类型实例化出具体的对象。
      
    class FoodFactory    {        public static Food ChooseFood(string foods)//选择食物,根据选择的食物实例化出具体的产品。        {            Food food = null;            switch (foods)            {                case "面条":                    food = new Noodles();//如果是面条,则实例化出面条对象。                    break;                case "馒头":                    food = new Buns();//如果是馒头,则实例化出馒头对象。                    break;                case "米饭":                    food = new Rice();//如果是米饭,则实例化出米饭对象。                    break;            }            return food;        }    }
     在客户端中,我们只需要传入具体的参数就可以通过工厂实例化出具体的产品,解除客户端与类的直接依赖关系。
      
   namespace 食堂   {    class Program    {        static void Main(string[] args)        {            Food food;    //定义变量            food = FoodFactory.ChooseFood("米饭");//传入参数“米饭”,通过“食物工厂”实例化出米饭类的具体产品。            food.GetFood();//调用Food类的GetFood()方法。            Console.Read();//显示结果。        }    }
   运行结果为:
                          

   简单工厂模式的优点与缺点

   优点:1、解除了客户端与具体产品的直接依赖,客户端传递参数通过工厂类实例化相关的类。2、实现了代码的复用。由于工厂类中定义了产品的具体实现,客户端可以任意变化,只要向其中传递参数就可使用产品。比如说,上述的例子学生在食堂买饭,我们完全可以把“食堂”换成“饭馆”,而食物工厂类(FoodFocatory)并没有发生变化。
   缺点:违背了“开放-封闭原则”,当添加一个产品时,我们就需要对工厂类进行大的改动。

   总结:

    通过上述例子,我对简单工厂模式的理解为,工厂类提供了一个产品的产源地(食堂),其中有许多产品(面条、馒头等),客户端(学生)通过告诉工厂类需要什么样的产品,工厂类就提供什么样的产品。客户端只消费产品,不需要生产产品。
    另外,由于简单工厂模式存在的缺点,使我们在编程中很少使用这种模式。但是,简单工厂模式包含的“解耦”思想确实值得我们去学习,在我们今后的编程中,要尽量避免过多类之间的耦合。
   
0 0
原创粉丝点击