今天,我们来试下C#的工厂模式:先来说下简单工厂模式:比如,生产汽车,汽车有很多车型,小汽车,SUV,MVP等,我们可以抽象出来一个它们的基类,比如都有灯,发动机等等通用的,然后我们让不同车型继承它们的基类,在我们需要生产哪种车型的时候,我们根据条件来生产不同车型。
说完概念,我们来个实例,计算机,根据输入的符号(加减乘除)来进行不同的运算,首先,我们要有个基类,如,需要两个数,一个返回的方法:
/// <summary> /// 抽象父类方法 /// </summary> public abstract class CalFather { public double One { get; set; } public double Two { get; set; } public CalFather(double n1,double n2) { this.One = n1; this.Two = n2; } //计算方法 public abstract double GetResult();
然后我们有加减两个运算,我们就需要两个继承父类的子类:
/// <summary> /// 加法计算 /// </summary> public class Add:CalFather{ public Add(double n1,double n2):base(n1,n2){} public override double GetResult(){ return this.One+this.Two; } } /// <summary> /// 减法计算 /// </summary> public class Sub : CalFather { public Sub(double n1, double n2) : base(n1, n2) { } public override double GetResult() { return this.One - this.Two; } }
然后,我们来“生产工厂”进行生产,根据传进来的条件,生产不同“车型”:
public static CalFather GetResult(string a,double n1,double n2) { CalFather cf = null; switch(a){ case "+": cf = new Add(n1,n2); break; case "-": cf = new Sub(n1, n2); break; } return cf; }
上面,我们会根据swith条件来返回不同的子类,然后在返回的子类里调用方法,返回结果:
static void Main(string[] args) { while (true) { Console.WriteLine("请输入第一个数字:"); double n1 = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("请输入第二个数字:"); double n2 = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("请输入符号:"); string a = Console.ReadLine(); CalFather cf = GetResult(a, n1, n2); Console.WriteLine("结果为:{0}", cf.GetResult()); Console.ReadKey(); }
到此结束,代码不复杂,在于理解工厂模式
完整代码:
class Program { static void Main(string[] args) { while (true) { Console.WriteLine("请输入第一个数字:"); double n1 = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("请输入第二个数字:"); double n2 = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("请输入符号:"); string a = Console.ReadLine(); CalFather cf = GetResult(a, n1, n2); Console.WriteLine("结果为:{0}", cf.GetResult()); Console.ReadKey(); } } public static CalFather GetResult(string a,double n1,double n2) { CalFather cf = null; switch(a){ case "+": cf = new Add(n1,n2); break; case "-": cf = new Sub(n1, n2); break; } return cf; } /// <summary> /// 抽象父类方法 /// </summary> public abstract class CalFather { public double One { get; set; } public double Two { get; set; } public CalFather(double n1,double n2) { this.One = n1; this.Two = n2; } //计算方法 public abstract double GetResult(); } /// <summary> /// 加法计算 /// </summary> public class Add:CalFather{ public Add(double n1,double n2):base(n1,n2){} public override double GetResult(){ return this.One+this.Two; } } /// <summary> /// 减法计算 /// </summary> public class Sub : CalFather { public Sub(double n1, double n2) : base(n1, n2) { } public override double GetResult() { return this.One - this.Two; } } }