简单工厂模式

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

       在我们平常编程中,往往要在客户端用“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)并没有发生变化。
   缺点:违背了“开放-封闭原则”,当添加一个产品时,我们就需要对工厂类进行大的改动。

   总结:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值