抽象工厂模式(Abstract Factory)
定义
抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
类图
描述
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类;
一个抽象工厂类,可以派生出多个具体工厂类;
每个具体工厂可以创建多个具体产品,即每个工厂可以生产一个产品集合。
应用场景
轿车是由发动机、车轮、车体结构、方向盘等部件组成的,现在要生产一辆轿车,就需要把各个部件抽象出来单独封装,再由汽车工厂来组装轿车。
/// <summary> /// 发动机接口 /// </summary> public interface IEngine { void Install(); } /// <summary> /// 奥迪发动机 /// </summary> public class AudiEngine : IEngine { public void Install() { Console.WriteLine("安装奥迪的发动机."); } } /// <summary> /// 奔驰发动机 /// </summary> public class BenzEngine : IEngine { public void Install() { Console.WriteLine("安装奔驰的发动机."); } } /// <summary> /// 车轮接口 /// </summary> public interface IWheel { void InstallLeftFrontWheel(); void InstallRightFrontWheel(); void InstallLeftBackWheel(); void InstallRightBackWheel(); } /// <summary> /// 奥迪车轮 /// </summary> public class AudiWheel : IWheel { public void InstallLeftFrontWheel() { Console.WriteLine("安装奥迪的左前车轮."); } public void InstallRightFrontWheel() { Console.WriteLine("安装奥迪的右前车轮."); } public void InstallLeftBackWheel() { Console.WriteLine("安装奥迪的左后车轮."); } public void InstallRightBackWheel() { Console.WriteLine("安装奥迪的右后车轮."); } } /// <summary> /// 奔驰车轮 /// </summary> public class BenzWheel : IWheel { public void InstallLeftFrontWheel() { Console.WriteLine("安装奔驰的左前车轮."); } public void InstallRightFrontWheel() { Console.WriteLine("安装奔驰的右前车轮."); } public void InstallLeftBackWheel() { Console.WriteLine("安装奔驰的左后车轮."); } public void InstallRightBackWheel() { Console.WriteLine("安装奔驰的右后车轮."); } } /// <summary> /// 车体结构接口 /// </summary> public interface IBody { void Install(); } /// <summary> /// 奥迪的车体结构 /// </summary> public class AudiBody : IBody { public void Install() { Console.WriteLine("安装奥迪的车身结构."); } } /// <summary> /// 奔驰的车体结构 /// </summary> public class BenzBody : IBody { public void Install() { Console.WriteLine("安装奔驰的车身结构."); } } /// <summary> /// 汽车工厂接口 /// </summary> public interface ICarFactory { IBody CreateBody(); IEngine CreateEngine(); IWheel CreateWheel(); } /// <summary> /// 具体的奥迪工厂类 /// </summary> public class AudiFactory : ICarFactory { public IEngine CreateEngine() { return new AudiEngine(); } public IWheel CreateWheel() { return new AudiWheel(); } public IBody CreateBody() { return new AudiBody(); } } /// <summary> /// 具体的奔驰工厂类 /// </summary> public class BenzFactory : ICarFactory { public IEngine CreateEngine() { return new BenzEngine(); } public IWheel CreateWheel() { return new BenzWheel(); } public IBody CreateBody() { return new BenzBody(); } }