抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它能创建一系列相关的对象,而无需指定其具体类。
解释  
抽象工厂模式建议为系列中的每件产品明确声明接口,然后确保所有产品变体都继承这些接口 。
接下来,我们需要声明抽象工厂,该类中包含系列中所有产品构造方法的接口。
对于系列产品的每个变体,我们都将基于抽象工厂接口创建不同的工厂类,每个工厂类都只能返回特定类别的产品 。
抽象工厂模式 UML  
适用场景  
如果代码需要与多个不同系列的相关产品交互,但是由于无法提前获取相关信息,或者出于对未来扩展性的考虑,你不希望代码基于产品的具体类进行构建,在这种情况下,你可以使用抽象工厂 
如果你有一个基于一组抽象方法的类,且其主要功能因此变得不明确,那么在这种情况下可以考虑使用抽象工厂模式 
 
代码示例  
using  System;namespace  AbstractFactoryPatternDemo   {          public  interface  IAbstractFactory      {         IAbstractProductA CreateProductA ( ) ;         IAbstractProductB CreateProductB ( ) ;     }     class  ConcreteFactory1  : IAbstractFactory      {         public  IAbstractProductA CreateProductA ( )         {             return  new  ConcreteProductA1();         }         public  IAbstractProductB CreateProductB ( )         {             return  new  ConcreteProductB1();         }     }     class  ConcreteFactory2  : IAbstractFactory      {         public  IAbstractProductA CreateProductA ( )         {             return  new  ConcreteProductA2();         }         public  IAbstractProductB CreateProductB ( )         {             return  new  ConcreteProductB2();         }     }          public  interface  IAbstractProductA      {         string  UsefulFunctionA ( ) ;     }     class  ConcreteProductA1  : IAbstractProductA      {         public  string  UsefulFunctionA ( )         {             return  "The result of the product A1." ;         }     }     class  ConcreteProductA2  : IAbstractProductA      {         public  string  UsefulFunctionA ( )         {             return  "The result of the product A2." ;         }     }          public  interface  IAbstractProductB      {         string  UsefulFunctionB ( ) ;         string  AnotherUsefulFunctionB (IAbstractProductA collaborator ) ;     }     class  ConcreteProductB1  : IAbstractProductB      {         public  string  UsefulFunctionB ( )         {             return  "The result of the product B1." ;         }         public  string  AnotherUsefulFunctionB (IAbstractProductA collaborator )         {             var  result = collaborator.UsefulFunctionA();             return  $"The result of the B1 collaborating with the ({result} )" ;         }     }     class  ConcreteProductB2  : IAbstractProductB      {         public  string  UsefulFunctionB ( )         {             return  "The result of the product B2." ;         }         public  string  AnotherUsefulFunctionB (IAbstractProductA collaborator )         {             var  result = collaborator.UsefulFunctionA();             return  $"The result of the B2 collaborating with the ({result} )" ;         }     }          class  Client      {         public  void  Main ( )         {                          Console.WriteLine("Client: Testing client code with the first factory type..." );             ClientMethod(new  ConcreteFactory1());             Console.WriteLine();             Console.WriteLine("Client: Testing the same client code with the second factory type..." );             ClientMethod(new  ConcreteFactory2());         }         public  void  ClientMethod (IAbstractFactory factory )         {             var  productA = factory.CreateProductA();             var  productB = factory.CreateProductB();             Console.WriteLine(productB.UsefulFunctionB());             Console.WriteLine(productB.AnotherUsefulFunctionB(productA));         }     }          class  Program      {         static  void  Main (string [] args )         {             new  Client().Main();                                                                                                                 }     } }