这篇文章距离最后更新已过30          天,如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
        
       
      
        
      定义
- 定义一个用于创建对象的接口,让子类决定实例化哪个类,工厂方法使一个类的实例化延迟到子类
 - 在简单工厂的基础上,将根据条件实例化子类的工厂类抽成抽象类,然后由每个子类继承这个抽象类,然后实例化自己。把用什么类的判断交给客户端判断
 
代码实现
// 抽象类,各小类实现
abstract class Operation
{
    public abstract double GetResult(double A,double B);
}
Class Add: Operation
{
    public override double GetResult(double A, double B)
    {
        return A+ B;
    }
}
class Minu: Operation
{
    public override double GetResult(double numberA, double numberB)
    {
        return numberA - numberB;
    }
}
// 简单工厂,包含使用哪个方法的判断逻辑
class OperationFactory
{
    public static Operation CreateOperation(string opt)
    {
        switch(opt)
        {
            case "+": return new Add();
            case "-": return new Minu();
            default: return null;
        }
    }
}
// 工厂方法,不提供使用哪个方法的判断逻辑
interface OptFactory
{
     Operation CreateOperation();
}
class AddFactory : OptFactory
{
    public Operation CreateOperation()
    {
        return new Add();
    }
}
class MinuFactory : OptFactory
{
    public Operation CreateOperation()
    {
        return new Minu();
    }
}
void Main()
{
    // 简单工厂
     Operation pot = OperationFactory.CreateOperation("+");
     var result = pot.GetResult(10, 20);
    // 工厂方法
     OptFactory opt = new AddFactory();
     var optAdd = opt.CreateOperation();
      var result2 = optAdd.GetResult(100, 2000);
}
简单工厂 vs 工厂方法
- 简单工厂使用使用哪种方法逻辑,客户端不用判断该选择那个
 - 工厂方法将判断逻辑交由客户端判断,自己提供所有实现小类的所有工厂类
 
优点
- 最大的好处是,去除了对具体产品的依赖
 - 符合开放封闭原则,不会改动之前的代码,而简单工厂需要改动
 
缺点
- 增加了代码量工作量,需要自行判断
 - 添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类,系统类的个数将成对增加,在一定程度上增加了系统的复杂度;同时,有更多的类需要编译和运行,会给系统带来一些额外的开销;
 - 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。
 - 虽然保证了工厂方法内的对修改关闭,但对于使用工厂方法的类,如果要更换另外一种产品,仍然需要修改实例化的具体工厂类;一个具体工厂只能创建一种具体产品