抽象工厂模式
概述
抽象工厂提供一个创建产品的接口来负责创建相关或依赖的对象,而不具体明确指定具体类。也可以这样理解,它负责创建某一特定系列产品,但是它只提供接口方法。
抽象工厂的意义
假如我们去理发店,给师傅说剪个平头,师傅可能使用推子;剪个杀马特,师傅可能会使用剪刀。我们说出理发的需求,理发师傅就会用不同的处理方法满足我们的需求,我们把需求抽象,这样我们就可以增加具体类来丰富我们的需求;同样,我们把方法抽象,我们也可以来丰富我们的处理方法。这样,我们就不需要修改我们的源代码,直接增加需求和方法的具体类,增加了代码的可扩展性。(开放-闭合原则:对扩展开放,对修改关闭)
实现抽象工厂类
这里涉及到2个抽象类,即需求和方法:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace AbstractFactory 7 { 8 //需求 抽象类 9 public abstract class Factory 10 { 11 public abstract Method HairStyle(); 12 } 13 14 //方法 抽象类 15 public abstract class Method 16 { 17 public abstract void UseMethod(); 18 } 19 20 /// <summary> 21 /// 平头 22 /// </summary> 23 public class pingtouFactory : Factory 24 { 25 public override Method HairStyle() 26 { 27 Console.WriteLine(" 需求: 平头"); 28 return new pingtouMethod(); 29 } 30 } 31 public class pingtouMethod : Method 32 { 33 public override void UseMethod() 34 { 35 Console.WriteLine(" 方法: 平头\n"); 36 } 37 } 38 // 39 40 /// <summary> 41 /// 杀马特 42 /// </summary> 43 public class shamateFactory : Factory 44 { 45 public override Method HairStyle() 46 { 47 Console.WriteLine(" 需求: 杀马特"); 48 return new shamateMethod(); 49 } 50 } 51 public class shamateMethod : Method 52 { 53 public override void UseMethod() 54 { 55 Console.WriteLine(" 方法: 杀马特\n"); 56 } 57 } 58 59 class Program 60 { 61 static void Main(string[] args) 62 { 63 Factory p = new pingtouFactory(); 64 p.HairStyle().UseMethod(); 65 66 Factory s = new shamateFactory(); 67 s.HairStyle().UseMethod(); 68 } 69 } 70 }
如果我们还需要其他发型,我们只需要增加需求发型的具体类和方法类即可。不需要修改原来的代码。
但是这里的需求和方法是一一对应的,我们并不能增加一个需求的另外一种或者多种方法。因为接口只有一个,增加多种方法,就需要修改抽象接口类。