天天看点

C# 常用的设计模式之简单工厂模式

一、引言

  最近在看设计模式,同时在学习过程中也查看了大量的博客,也查阅了很多关于设计模式的一些文章的,在此,特别记录下我的学习笔记,加深自己对设计模式理解,同时可以给一些初学设计模式的朋友提供查阅的路径。

二、简单工厂模式介绍

  什么是简单工厂模式?其实,我们也可以理解简单工厂模式为负责生产对象的一个类, 在平时的编程中,我们大多数都会使用"new"关键字创建一个对象,此时该类就依赖与这个对象,称为耦合度,当然这种情况下的耦合度时十分高的,当需求变化时,我们就不得不去修改此类的源码,为了解决这种维护起来复杂的情况,我们运用面向对象的原则去解决它,就是封装改变,既然要封装改变,自然也就要找到改变的代码,然后把改变的代码用类来封装,这样的一种思路也就是我们简单工厂模式的实现方式了。下面通过一个现实生活中的例子来引出简单工厂模式。举个例子:我们常在外吃饭,也可以自己在家做饭吃,但是自己做饭吃麻烦,因为又要自己买菜,然而,出去吃饭就完全没有这些麻烦的,我们只需要到餐馆点菜就可以了,买菜的事情就交给餐馆做就可以了,这里餐馆就充当简单工厂的角色,下面让我们看看现实生活中的例子用代码是怎样来表现的。该程序在WebForm中完成:

新建一个类:Customer.cs :

public class Customer
    {
        public static Food Cook(string type)
        {
            Food food = null;
            // 想吃可乐鸡翅怎么办?自己做吧
            if (type.Equals("可乐鸡翅"))
            {
                food = new Chicken();
            }
            // 又想吃红烧肉, 还是得自己做
            else if (type.Equals("一份红烧肉"))
            {
                food = new Beef();
            }
            //就这样,想吃什么就自己做什么,很累的。
            return food;
            
        }
        /// <summary>
        /// 菜抽象类
        /// </summary>
        public abstract class Food
        {
            // 输出点了什么菜
            public abstract string Print();
        }

        /// <summary>
        /// 可乐鸡翅
        /// </summary>
        public class Chicken: Food
        {
            public override string Print()
            {
                 return "一份可乐鸡翅!";
            }
        }

        /// <summary>
        /// 红烧肉
        /// </summary>
        public class Beef: Food
        {
            public override string Print()
            {
                return "一份红烧肉";
            }
        }
    }
           

在aspx页面实例化:

protected void Page_Load(object sender, EventArgs e)
        {
            // 做可乐鸡翅
            Food food1 = Cook("可乐鸡翅");
            Response.Write(food1.Print());

            Food food2 = Cook("红烧肉");
            Response.Write(food2.Print());
        }
           

效果:

C# 常用的设计模式之简单工厂模式

      我们可以发现,当我们想吃新的菜式时,就需要修改 Food Cook,然后在写一个新的方法输出点菜信息,这些操作十分繁琐,于是,为了解决这个问题,简单工厂就出现了,好比现在的餐馆,这样我们要吃什么直接说就行,其他不走交给了餐馆,降低了我们与才之间的依赖性。这样实现简单工厂如下:

修改 Customer.cs 如下:

public class Customer
    {
        /// <summary>
        /// 菜抽象类
        /// </summary>
        public abstract class Food
        {
            // 输出点了什么菜
            public abstract string Print();
        }

        /// <summary>
        /// 可乐鸡翅
        /// </summary>
        public class Chicken: Food
        {
            public override string Print()
            {
                 return "一份可乐鸡翅!";
            }
        }

        /// <summary>
        /// 红烧肉
        /// </summary>
        public class Beef: Food
        {
            public override string Print()
            {
                return "一份红烧肉";
            }
        }

        /// <summary>
        /// 简单工厂类, 负责 炒菜
        /// </summary>
        public class FoodSimpleFactory
        {
            public static Food CreateFood(string type)
            {
                Food food = null;
                if (type.Equals("可乐鸡翅"))
                {
                    food = new Chicken();
                }
                else if (type.Equals("红烧肉"))
                {
                    food = new Beef();
                }

                return food;
            }
        }
    }
           

 我们发现这次的 customer.cs 类中,将烧菜方法封装成了一个单独的类,这时候,我们只用去修改这个工厂里的方法就可以了,而不用在之前的类中找方法去修改,这样有助于提高大型项目的维护效率。

在aspx页面实例化:

protected void Page_Load(object sender, EventArgs e)
        {
             // 客户想点一个可乐鸡翅       
            Food food1 = FoodSimpleFactory.CreateFood("可乐鸡翅");
            Response.Write(food1.Print());

            // 客户想点一个红烧肉       
            Food food2 = FoodSimpleFactory.CreateFood("红烧肉");
            Response.Write(food2.Print());
        }
           

 细心的朋友会发现,在简单工厂模式下,我们只是把变化移到了工厂类中罢了,好像没有变化的问题,因为如果客户想吃其他菜时,此时我们还是需要修改工厂类中的方法,没错,这就是简单工厂的缺点。

三、总结

到这里,简单工厂模式的介绍都到这里了,后面将介绍工厂方法模式来解决简单工厂模式中存在的问题。

继续阅读