首页 > 代码库 > 抽象工厂方法模式(Abstract Factory Pattern)
抽象工厂方法模式(Abstract Factory Pattern)
Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。
关键代码:在一个工厂里聚合多个同类产品。
应用实例:汽车工厂生产轿车和卡车,轿车和卡车就是同类产品(都是汽车嘛,汽车内当然大多零件生产是相通的),通过抽象工厂,还可以复用许多代码。
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。如示例中,增加一个MiniCar产品,改动较大,但是如果说增加一个五菱品牌(相当于产品等级,肯定比BMW级别低了很多吧),直接继承抽象类扩展即可。
使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序(因为接口相同,调用工厂的不同方法生产相应操作系统的程序,屏蔽底层操作影响,例如AppFactory.CreateLinuxApp,AppFactory.CreateWindowsApp)。
注意事项:产品族难扩展,产品等级易扩展。
抽象类:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace DesignPattern.AbscractFactoryPattern 7 { 8 //这里使用抽象类是因为接口必须在子类实现方法,抽象类可以延迟到抽象子类去。 9 public abstract class AbstractCar10 {11 public abstract void Run();12 public abstract void BeBe();13 public abstract void GetBrand();14 }15 16 public abstract class AbstractCarFactory17 {18 public static AbstractCarFactory GetInsance()19 {20 //这里应该去读取配置文件,由于是demo就直接赋值了。21 string factoryName = "BMWCarFactory";22 23 AbstractCarFactory instance;24 25 if (factoryName != "")26 instance = (AbstractCarFactory)Assembly.Load("DesignPattern").CreateInstance("DesignPattern.AbscractFactoryPattern." + factoryName);27 else28 instance = null;29 30 return instance;31 }32 public abstract AbstractCar CreateSaloonCar();33 public abstract AbstractCar CreateTruckCar();34 }35 36 public abstract class AbstractSaloonCar : AbstractCar37 {38 public override void Run()39 {40 Console.WriteLine("我是轿车~~");41 }42 43 public override void BeBe()44 {45 Console.WriteLine("嘀嘀嘀~!!!");46 }47 }48 49 public abstract class AbstractTruckCar : AbstractCar50 {51 public override void Run()52 {53 Console.WriteLine("我是大卡卡卡卡……");54 }55 56 public override void BeBe()57 {58 Console.WriteLine("嘟嘟嘟嘟嘟!!!");59 }60 }61 }
Benz工厂
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace DesignPattern.AbscractFactoryPattern 7 { 8 public class BenzCarFactory : AbstractCarFactory 9 {10 public override AbstractCar CreateSaloonCar()11 {12 return new BenzSaloonCar();13 }14 15 public override AbstractCar CreateTruckCar()16 {17 return new BenzTruckCar();18 }19 }20 21 public class BenzSaloonCar : AbstractSaloonCar22 {23 public override void GetBrand()24 {25 Console.WriteLine("我是奔驰轿车!!!");26 }27 }28 29 public class BenzTruckCar : AbstractTruckCar30 {31 public override void GetBrand()32 {33 Console.WriteLine("我是奔驰大卡!!!");34 }35 }36 }
BMW工厂
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace DesignPattern.AbscractFactoryPattern 7 { 8 public class BMWCarFactory : AbstractCarFactory 9 {10 public override AbstractCar CreateSaloonCar()11 {12 return new BMWSaloonCar();13 }14 15 public override AbstractCar CreateTruckCar()16 {17 return new BMWTruckCar();18 }19 }20 21 public class BMWSaloonCar : AbstractSaloonCar22 {23 public override void GetBrand()24 {25 Console.WriteLine("我是宝马轿车!");26 }27 }28 29 public class BMWTruckCar : AbstractTruckCar30 {31 public override void GetBrand()32 {33 Console.WriteLine("我是宝马大卡!!!");34 }35 }36 }
模拟场景
这个月只生产Benz轿车。下个月生产卡车换个方法即可。下一年生产BMW换个工厂即可(修改配置文件)。
1 //与工厂模式最大区别就是一个产品族的问题,同样的产品拥有很多相同约束,这样就不用重复写代码。2 //AbstractCarFactory BenzFactory = new BenzCarFactory();//这里使用反射完全解耦3 AbstractCarFactory Factory = AbstractCarFactory.GetInsance();4 AbstractCar _saloonCar = Factory.CreateSaloonCar();5 _saloonCar.BeBe();6 _saloonCar.Run();7 _saloonCar.GetBrand();
抽象工厂方法模式(Abstract Factory Pattern)