工厂方法定义:这是设计模式中创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
主要意图:创建对象的接口,让实现该接口的类决定要实例化哪个类。
解决问题:接口选择
应用地点:明确地计划不同条件下创建不同实例时。
注意事项:作为创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。
优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
在这里与简单工厂对比,工厂方法克服了简单工厂违背发放-封闭原则的缺点,还保持了封装对象创建过程的优点。
工厂方法计算机类图:
代码实现:
using System; namespace _01工厂方法 { class Program { static void Main(string[] args) { Console.WriteLine("请输入数字a"); double a = Convert.ToDouble(Console.ReadLine()); //Console.WriteLine("请输入符号"); //Operation oper = operation(Console.ReadLine()); Console.WriteLine("请输入数字b"); double b = Convert.ToDouble(Console.ReadLine()); IFactory operFactory = new MulFactory(); Operation oper = operFactory.CreateOperation(); oper.NumberA = a; oper.NumberB = b; double result = oper.GetResult(); Console.WriteLine(result); Console.ReadKey(); } } /// <summary> /// 工厂接口 /// </summary> interface IFactory { Operation CreateOperation(); } /// <summary> /// 加法类工厂 /// </summary> class AddFactory : IFactory { public Operation CreateOperation() { return new OperationAdd(); } } /// <summary> /// 减法类工厂 /// </summary> class SubFactory : IFactory { public Operation CreateOperation() { return new OperationSub(); } } /// <summary> /// 乘法类工厂 /// </summary> class MulFactory : IFactory { public Operation CreateOperation() { return new OperationMul(); } } /// <summary> /// 除法类工厂 /// </summary> class DivFactory : IFactory { public Operation CreateOperation() { return new OperationDiv(); } } /// <summary> /// 加法类 /// </summary> class OperationAdd : Operation { public override double GetResult() { double result = 0; result = NumberA + NumberB; return result; } } /// <summary> /// 减法类 /// </summary> class OperationSub : Operation { public override double GetResult() { double result = 0; result = NumberA - NumberB; return result; } } /// <summary> /// 乘法类 /// </summary> class OperationMul : Operation { public override double GetResult() { double result = 0; result = NumberA * NumberB; return result; } } /// <summary> /// 除法类 /// </summary> class OperationDiv : Operation { public override double GetResult() { double result = 0; if (NumberB == 0) { throw new Exception("除数不能为0."); } result = NumberA / NumberB; return result; } } public class Operation { private double _numberA = 0; private double _numberB = 0; public double NumberA { get { return _numberA; } set { _numberA = value; } } public double NumberB { get { return _numberB; } set { _numberB = value; } } public virtual double GetResult() { double result = 0; return result; } } }