铝缉惹 发表于 2025-6-9 00:23:50

设计模式(三)抽象工厂

一、定义

提供一个创建一系列相关或互相依赖对象的接口,而无须指定他们具体的类,抽象工厂模式是一种创建型模式。
二、描述

抽象工厂比工厂方法的抽象程度更高,通过引入了工厂等级结构,解决了简单工厂模式中工厂类职责太重的原则。为了更好的理解抽象工厂模式,引入两个概念:
1、产品等级结构:指不同品牌的同一类型产品,如:小米电视机、海信电视机、索尼电视机
2、产品族:指同一品牌的不同了类型产品,如:小米电视机、小米手机、小米电脑
抽象工厂模式中的每个具体工厂提供了多个工厂方法用于产生多种不同类型的产品,这些产品构成了一个产品族,它包含以下四个角色:
1、AbstractFactory (抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。
2、ConcreteFactory (具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
3、AbstractProduct (抽象产品角色):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
4、ConcreteProduct (具体产品角色):它定义具体工厂生产的具体产品对象,实现在抽象产品接口中声明的业务方法。
三、例子

X公司要开发一套皮肤库,可切换不同风格,如春天风格,用浅绿色按钮、文本框等,夏天用浅蓝色的,后续还可以增加其他风格。
抽象产品接口:Button、TextField、ComboBox
public interface IButton
{
    void Display();
}

public interface ITextField
{
    void Display();
}

public interface IComboBox
{
    void Display();
}具体产品类:
SpringButton、SpringTextField、SpringComboBox,Spring风格按钮、文本框、组合框
SummerButton、SummerTextField、SummerComboBox,Summer风格按钮、文本框、组合框
public class SpringButton : IButton
{
    public void Display()
    {
      Console.WriteLine("显示浅绿色按钮。");
    }
}

public class SpringTextField : ITextField
{
    public void Display()
    {
      Console.WriteLine("显示绿色边框文本框。");
    }
}

public class SpringComboBox : IComboBox
{
    public void Display()
    {
      Console.WriteLine("显示绿色边框下拉框。");
    }
}

public class SummerButton : IButton
{
    public void Display()
    {
      Console.WriteLine("显示浅绿色按钮。");
    }
}

public class SummerTextField : ITextField
{
    public void Display()
    {
      Console.WriteLine("显示绿色边框文本框。");
    }
}

public class SummerComboBox : IComboBox
{
    public void Display()
    {
      Console.WriteLine("显示绿色边框下拉框。");
    }
}抽象皮肤工厂接口:ISkinFactory
public interface ISkinFactory
{
    IButton CreateButton();
    ITextField CreateTextField();
    IComboBox CreateComboBox();
}具体皮肤工厂类:SpringSkinFactory、SummerSkinFactory
public class SpringSkinFactory : ISkinFactory
{
    public IButton CreateButton()
    {
      return new SpringButton();
    }

    public IComboBox CreateComboBox()
    {
      return new SpringComboBox();
    }

    public ITextField CreateTextField()
    {
      return new SpringTextField();
    }
}

public class SummerSkinFactory : ISkinFactory
{
    public IButton CreateButton()
    {
      return new SummerButton();
    }

    public IComboBox CreateComboBox()
    {
      return new SummerComboBox();
    }

    public ITextField CreateTextField()
    {
      return new SummerTextField();
    }
}Program:测试代码
Console.WriteLine("加载Spring皮肤\n");

ISkinFactory skinFactory = new SpringSkinFactory();

IButton button = skinFactory.CreateButton();
ITextField textField = skinFactory.CreateTextField();
IComboBox comboBox = skinFactory.CreateComboBox();

button.Display();
textField.Display();
comboBox.Display();

Console.ReadLine();
四、总结

如果需要增加新的产品族很方便,无需修改已有系统,符合开闭原则,但是如果需要增加产品等级结构,会非常麻烦,比如单选按钮(RadioButton),因为抽象工厂ISkinFactory根本没有提供创建的方法,需要依次修改抽象工厂接口、具体皮肤工厂类,抽象工厂模式无法很好的解决此类问题,这也是该模式最大的缺点,所以不适合在产品等级结构不稳定的场景下使用。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

卢莹洁 发表于 2025-11-28 18:59:51

喜欢鼓捣这些软件,现在用得少,谢谢分享!

巩芷琪 发表于 2025-12-12 07:40:08

谢谢分享,试用一下

福清婉 发表于 2025-12-18 22:12:48

这个好,看起来很实用

何玲 发表于 2025-12-19 03:08:50

yyds。多谢分享

鲫疹 发表于 2026-1-14 03:07:44

热心回复!

姥恫 发表于 2026-1-14 19:40:08

过来提前占个楼

茹静曼 发表于 2026-1-15 05:37:23

谢谢分享,试用一下

吕颐然 发表于 2026-1-15 06:09:46

不错,里面软件多更新就更好了

翁谌缜 发表于 2026-1-17 22:07:24

鼓励转贴优秀软件安全工具和文档!

劳欣笑 发表于 2026-1-19 10:13:28

用心讨论,共获提升!

梢疠 发表于 2026-1-20 13:54:18

谢谢分享,试用一下

越蔓蔓 发表于 2026-1-21 04:44:15

过来提前占个楼

捡嫌 发表于 2026-1-21 14:26:43

这个有用。

姥恫 发表于 2026-1-22 23:43:23

感谢发布原创作品,程序园因你更精彩

萨瑞饨 发表于 2026-1-23 21:01:19

这个好,看起来很实用

薯羞 发表于 2026-1-30 17:59:38

感谢发布原创作品,程序园因你更精彩

肿抢 发表于 2026-2-3 05:04:05

新版吗?好像是停更了吧。

洪思思 发表于 2026-2-3 11:07:12

谢谢分享,辛苦了

替攀浮 发表于 2026-2-4 06:50:07

东西不错很实用谢谢分享
页: [1] 2
查看完整版本: 设计模式(三)抽象工厂