简单工厂模式

时间:2021-05-26 19:42:54

前言:

    终于开始设计模式了,感觉他们挺好玩的,让我对编程也有了更深的认识。


简单工厂模式:

   简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。


下面通过例子进行讲解

机器人做饭,输入需要的食品,然后显示制作完成。

    public class Cook
    {

        public static string Make(string name)
        {
            string result = "";
            switch (name)
            {
                case "面条":
                    result = "面条做好了";
                    break;
                case "米饭":
                    result = "米饭做好了";
                    break;
            }
            return result;
        }
    } 

上边的代码就是Cook类,客户通过Make方法就可以进行米饭或者面条的制作。

优点:封装性,是的客户不用关心内部的实现过程,只需要方法就可以得到想要的食品。

缺点:不灵活,如果需要制作其他的食品,就需要改类里边的代码,比较繁琐,可能影响别的功能代码。


改进版:

  

public class Cook
    {
        private string _number1 = "1"; //需要制作的食品数量

        public string number1
        {
           get { return _number1; }
            set { _number1 = value; }
        }
        public virtual  string Make(string a)
        {
            String result = "";
                return result;
        }
    }

    class MianTiao : Cook
    {
        public  override string Make(string a )
        {
            number1 = a;
            string result = "面条制作好了,请享用!   ";
            
            return result+number1+"份";
        }
    }
  class MiFan : Cook
    {
        public  override string Make(string a )
        {
            number1 = a;
            string result = "米饭制作好了,请享用!   ";
            
            return result+number1+"份";
        }
    }
 
class Program
    {
        static void Main(string[] args)
        {
            MianTiao Num2 = new MianTiao();
            string Num3 = "";
            Console.WriteLine("欢迎光临机器人之家,我可以为您做 米饭 和 面条");
            Console.WriteLine("请输入需要制作的份数");
            Num3 = Console.ReadLine();
            Console.WriteLine("正在制作中  ");
            Console.WriteLine(Num2.Make(Num3));
            Console.ReadKey();
        }
    }
}



上边代码将 Cook类中的 面条和米饭的制作分别提出来各自成为一个类,然后继承Cook类,重写了 Make这个方法,使得添加或修改某一个功能不影响其他的功能,降低了耦合度。

优点:继承性,降低耦合度,降低修改代码出错的可能性

缺点:系统自己无法判别需要哪个功能模块进行执行。


简单工厂模式:

namespace 简单工厂模式
{
    public class Cook
    {
        private string _number1 = "1"; //需要制作的食品数量

        public string number1
        {
           get { return _number1; }
            set { _number1 = value; }
        }
        public virtual  string Make(string a)
        {
            String result = "";
                return result;
        }
    }

    class MianTiao : Cook
    {
        public  override string Make(string a )
        {
            number1 = a;
            string result = "面条制作好了,请享用!   ";
            
            return result+number1+"份";
        }
    }
    class MiFan : Cook
    {
        public override string Make(string a)
        {
            number1 = a;
            string result = "米饭制作好了,请享用!   ";

            return result + number1 + "份";
        }
    }

    public class CookFactory
    {
        public static Cook createCook(string name)
        {
            Cook ck = null;
            switch (name)
            {

                case "米饭":
                    ck = new MianTiao();
                    break;
                case "面条":
                    ck = new MianTiao();
                    break;             
            }
            return ck;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            string result;
            string num ="";
            Cook ck1;
            Console.WriteLine("输入要做的饭:米饭 或者 面条");
            ck1 = CookFactory.createCook(Console.ReadLine());
            Console.WriteLine("输入需要制作的份数");
            num = Console.ReadLine();
            result = ck1.Make(num);
            Console.WriteLine(result); 
            Console.ReadKey();

        }
    }
}

上边就是简单工厂模式的一个例子,通过CookFactroy我们可以让用户选择需要实例化谁,这样使得我们在添加新功能变得很方便,只需要添加制作食品的子类就可以,使得 业务和界面分离。

优点:模块清晰化,分工明确,代码就实现最渐层意义上的“可维护”。

缺点,增加功能我们就要去添加一个新的类,同时我们需要在Factory中改动到switch里面的代码,耦合性很高.


总结:

  简单工厂模式是我学的第一个设计模式,以前编写代码写一些功能的时候就没有这样想过,把他们各个功能写成子类,然后由工厂类选择去实例化,感觉自己以前自己编程都毫无技巧性或者可读性,现在只学了第一个就感觉神清气爽,我感觉我对编程更加有兴趣了。