概述
需求案例
简单工厂代码
/// <summary>/// 静态工作方法 实际上就是把创建对象的过程放到静态方法里面/// </summary>public class CalFactory{public static ICalculator GetCalculator(string oper){ICalculator? calculator = null;switch (oper){case "*":calculator = new Mul();break;case "+":calculator = new Add();break;case "-":calculator = new Sub();break;case "/":calculator = new Div();break;}return calculator;}}
public interface ICalculator{double GetResult(double d1,double d2);}public class Add : ICalculator{public double GetResult(double d1, double d2){return d1+ d2;}}public class Sub : ICalculator{public double GetResult(double d1, double d2){return d1-d2;}}public class Mul : ICalculator{public double GetResult(double d1, double d2){return d1* d2;}}public class Div : ICalculator{public double GetResult(double d1, double d2){return d1 / d2;}
//C# 控制台调用Console.WriteLine("简单工厂设计模式!");Console.WriteLine("请输入操作数1");var d1 = Convert.ToDouble(Console.ReadLine());Console.WriteLine("请输入操作数2");var d2 = Convert.ToDouble(Console.ReadLine());ICalculator calculator = null;Console.WriteLine("请输入操作符");string flag=Console.ReadLine();calculator= CalFactory.GetCalculator(flag);double reslut= calculator.GetResult(d1,d2);Console.WriteLine(reslut);
2、简单工厂起到了代码复用的作用;
缺点:
1、系统扩展困难,一旦加入新功能,就必须要修改工厂逻辑。破坏了开闭原则;
2、简单工厂集合了多有创建对象的逻辑,一旦不能正常工作,会导致整个系统出问题;
工厂方法代码
还是上面的需求,我们定义一个创建对象的接口,让子类决定实例化哪一个类。
public interface ICalFactory{ICalculator GetCalculator();}public class MulFactory : ICalFactory{public ICalculator GetCalculator(){return new Mul();}}public class AddFactory : ICalFactory{public ICalculator GetCalculator(){return new Add();}}public class SubFactory : ICalFactory{public ICalculator GetCalculator(){return new Sub();}}public class DivFactory : ICalFactory{public ICalculator GetCalculator(){return new Div();}}
public interface ICalculator{double GetResult(double d1, double d2);}public class Add : ICalculator{public double GetResult(double d1, double d2){return d1 + d2;}}public class Sub : ICalculator{public double GetResult(double d1, double d2){return d1 - d2;}}public class Mul : ICalculator{public double GetResult(double d1, double d2){return d1 * d2;}}public class Div : ICalculator{public double GetResult(double d1, double d2){return d1 / d2;}}
//C# 控制台调用Console.WriteLine("请输入操作数1");var d1 = Convert.ToDouble(Console.ReadLine());Console.WriteLine("请输入操作数2");var d2 = Convert.ToDouble(Console.ReadLine());Console.WriteLine("请输入操作符");string flag = Console.ReadLine();ICalFactory? calFactory = null;switch (flag){case "*":calFactory = new MulFactory();break;case "+":calFactory = new AddFactory();break;case "-":calFactory = new SubFactory();break;case "/":calFactory = new DivFactory();break;}ICalculator calculator=calFactory?.GetCalculator();var result= calculator.GetResult(d1, d2);Console.WriteLine(result);
没有switch case的工厂方法代码
public class OperFactory:Attribute{public string Oper { get; }public OperFactory(string value){Oper=value;}}
public class ReflectionFactory{//根据用户输入的操作符 返回一个对象Dictionary<string, ICalFactory> dic=new Dictionary<string, ICalFactory>();public ReflectionFactory(){//拿到当前正在运行的程序集Assembly assembly= Assembly.GetExecutingAssembly();foreach (var item in assembly.GetTypes()){//IsAssignableFrom 表示item继承了ICalFactory或实现了ICalFactoryif (typeof(ICalFactory).IsAssignableFrom(item)&&!item.IsInterface){OperFactory of= item.GetCustomAttribute<OperFactory>();if (of != null){//给键值对集合赋值dic[of.Oper] = Activator.CreateInstance(item) as ICalFactory;}}}}public ICalFactory GetFac(string s){if (dic.ContainsKey(s)){return dic[s];}return null;}}
public interface ICalFactory{ICalculator GetCalculator();}[OperFactory("*")]public class MulFactory : ICalFactory{public ICalculator GetCalculator(){return new Mul();}}[OperFactory("+")]public class AddFactory : ICalFactory{public ICalculator GetCalculator(){return new Add();}}[OperFactory("-")]public class SubFactory : ICalFactory{public ICalculator GetCalculator(){return new Sub();}}[OperFactory("/")]public class DivFactory : ICalFactory{public ICalculator GetCalculator(){return new Div();}}
//C# 控制台调用ReflectionFactory reflectionFactory = new ReflectionFactory();ICalFactory calFactory2= reflectionFactory.GetFac(flag);var result2= calFactory2.GetCalculator().GetResult(d1, d2);Console.WriteLine(result2);