抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品
当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、更有效率
抽象工厂模式包含以下4个角色:
•AbstractFactory(抽象工厂)
•ConcreteFactory(具体工厂)
•AbstractProduct(抽象产品)
•ConcreteProduct(具体产品)
某软件公司要开发一套界面皮肤库,可以对基于.NET平台的桌面软件进行界面美化。用户在使用时可以通过菜单来选择皮肤,不同的皮肤将提供视觉效果不同的按钮、文本框、组合框等界面元素,例如春天(Spring)风格的皮肤将提供浅绿色的按钮、绿色边框的文本框和绿色边框的组合框,而夏天(Summer)风格的皮肤则提供浅蓝色的按钮、蓝色边框的文本框和蓝色边框的组合框,其结构示意图如下图所示:
/// <summary> /// 界面皮肤工厂接口,充当抽象工厂 /// </summary> public interface ISkinFactory { IButton CreateButton(); ITextField CreateTextField(); IComboBox CreateComboBox(); } /// <summary> /// 按钮接口,充当抽象产品 /// </summary> public interface IButton { void Display(); } /// <summary> /// 组合框接口,充当抽象产品 /// </summary> public interface IComboBox { void Display(); } /// <summary> /// 文本框接口,充当抽象产品 /// </summary> public interface ITextField { void Display(); } /// <summary> /// Spring皮肤工厂,充当具体工厂 /// </summary> public class SpringSkinFactory : ISkinFactory { public IButton CreateButton() { return new SpringButton(); } public ITextField CreateTextField() { return new SpringTextField(); } public IComboBox CreateComboBox() { return new SpringComboBox(); } } /// <summary> /// Spring按钮类,充当具体产品 /// </summary> public class SpringButton : IButton { public void Display() { Console.WriteLine("显示浅绿色按钮。"); } } /// <summary> /// Spring文本框类,充当具体产品 /// </summary> public class SpringTextField : ITextField { public void Display() { Console.WriteLine("显示绿色边框文本框。"); } } /// <summary> /// Spring组合框类,充当具体产品 /// </summary> public class SpringComboBox : IComboBox { public void Display() { Console.WriteLine("显示绿色边框组合框。"); } }
客户端调用:
ISkinFactory factory = new SpringSkinFactory(); IButton bt = factory.CreateButton(); bt.Display();