【愚公系列】2023年10月 二十三种设计模式(二)-抽象工厂模式(Abstract Factory Pattern)
🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
🚀前言
设计模式(Design Pattern)是软件开发领域的宝贵经验,是多人反复借鉴和广泛应用的代码设计指导。它们是一系列经过分类和归纳的代码组织方法,旨在实现可重用性、可维护性和可理解性。使用设计模式,我们能够编写高质量的代码,使其更易于他人理解,并提供了代码可靠性的保证。
毫无疑问,设计模式对个人、团队和整个系统都带来了显著的益处。它们将代码开发提升到工程化水平,为软件工程构建提供了坚实的基础,就如同大厦的一块块精巧的砖石一样。在项目中明智地应用设计模式可以完美地解决各种复杂问题。每种设计模式都有相应的原理和最佳实践,它们描述了我们日常开发中不断遇到的问题,以及这些问题的核心解决方法。正是因为这种实用性和通用性,设计模式才能在软件开发中广泛地得以应用。设计模式是构建稳健、可扩展和可维护软件的关键工具,为开发者们提供了解决问题的智慧和指导。
🚀一、抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式是一种创建型设计模式,它为创建一组相关或相互依赖的对象提供了一个抽象的接口,而不需要明确指定它们的具体类。
这个模式的主要目标是向客户端提供一个接口,以便客户端能够在不必指定具体产品的情况下,创建属于不同产品族的产品对象。
抽象工厂模式的关键特点包括:
它定义了一个抽象工厂接口,该接口包含多个抽象方法,每个方法用于创建一个产品对象。
每个具体工厂类都实现了抽象工厂接口,负责创建特定产品族的具体产品对象。
客户端代码通过与抽象工厂接口交互,而不需要直接与具体产品类交互,从而实现了松耦合。
抽象工厂模式通常用于需要创建一组相关的产品,这些产品之间具有一定的关联或兼容性,例如,创建不同操作系统的界面元素或不同风格的家具。
抽象工厂模式提供了一种灵活的方式来处理对象的创建,使得系统更容易维护和扩展。它的核心思想是将产品的创建抽象化,使客户端不必关心具体的产品类,而只需依赖于抽象工厂接口。这有助于实现多态性、符合开闭原则,并支持创建多个相关产品族的对象。
🚀二、使用步骤
🔎1.角色
🦋1.1 抽象工厂(Creator)
抽象工厂模式(Abstract Factory Pattern)中的抽象工厂(Creator)是一个关键的概念,它在这个设计模式中扮演着重要的角色。以下是抽象工厂的概念和作用:
概念:
- 抽象工厂是一个接口或抽象类,它声明了一组用于创建一系列相关或相互依赖的产品对象的抽象方法。
- 抽象工厂通常包含多个抽象方法,每个方法用于创建不同种类或族类的产品对象。
- 具体的工厂类实现了抽象工厂接口,负责创建特定种类或族类的具体产品对象。
作用:
- 抽象工厂的主要作用是封装了产品的创建过程,使客户端代码不需要知道具体的产品类,只需要依赖于抽象工厂接口。
- 抽象工厂模式实现了一种工厂的工厂,它允许你创建一组相关或兼容的产品,而不用关心它们的具体类。
- 抽象工厂模式提供了一种高层次的抽象,有助于实现客户端代码与具体产品类之间的解耦,从而提高了系统的灵活性和可维护性。
- 抽象工厂模式支持创建不同产品族的对象,每个具体工厂类负责一个产品族的创建,这有助于保持产品之间的关联性和一致性。
抽象工厂模式中的抽象工厂充当了产品创建的中心,它定义了一组抽象方法,每个方法对应一个产品的创建操作。具体的工厂类实现了这些方法,根据不同的需求创建具体的产品对象。这种结构使得系统更加灵活,能够轻松应对不同种类或族类产品的需求。
🦋1.2 具体工厂(Concrete Creator)
抽象工厂模式(Abstract Factory Pattern)中的具体工厂(Concrete Creator)是实现抽象工厂接口的具体类,它扮演了一种关键的角色。以下是具体工厂的概念和作用:
概念:
- 具体工厂是抽象工厂模式中的一部分,它是抽象工厂的实现之一,负责创建一组相关或相互依赖的具体产品对象。
- 每个具体工厂类对应一个产品族,它实现了抽象工厂接口中定义的方法,用于创建产品对象。
- 具体工厂类通常与特定的产品族相关联,因此它们的职责是创建该产品族的产品。
作用:
- 具体工厂的主要作用是将产品的实际创建过程封装在具体的工厂类中,使客户端代码可以通过与抽象工厂接口交互,而不需要关心具体产品的实现细节。
- 具体工厂类实现了抽象工厂接口中的方法,根据客户端的请求创建相应的产品对象。这有助于实现客户端与产品的解耦,提高了系统的可维护性和可扩展性。
- 具体工厂类的存在使得抽象工厂模式可以支持创建不同产品族的对象,每个具体工厂类负责创建特定产品族的产品。这有助于保持产品之间的一致性和关联性。
具体工厂是抽象工厂模式中的具体实现,它们实现了抽象工厂接口中定义的方法,根据不同的产品族创建具体的产品对象。通过具体工厂,客户端代码可以方便地获取所需的产品对象,同时不需要了解具体产品类的实现细节。这种结构使得抽象工厂模式能够有效地支持创建不同产品族的对象,并帮助实现系统的松耦合。
🦋1.3 抽象产品(Product)
抽象工厂模式(Abstract Factory Pattern)中的抽象产品(Abstract Product)是定义了一组相关产品的抽象类或接口,它在这个设计模式中具有重要的概念和作用。以下是抽象产品的概念和作用:
概念:
- 抽象产品是一组相关产品的共同抽象,它可以是一个抽象类或接口,定义了一组方法或属性,用于描述产品应该具有的通用特性和行为。
- 抽象产品并不包含具体的实现细节,而是定义了产品应该具备的外观和行为,它是产品家族中各个具体产品的公共接口。
作用:
- 抽象产品的主要作用是提供了一个统一的接口,用于表示一组相关产品。这使得客户端代码可以通过这个抽象接口与不同具体产品进行交互,而无需关心具体产品类的实现。
- 抽象产品定义了产品的通用特性,有助于保持产品之间的一致性。这意味着客户端代码可以在不同产品之间进行切换,而不会引入破坏性的变化。
- 抽象产品也有助于实现多态性,客户端可以通过抽象产品接口来处理不同种类的具体产品,从而提高了系统的灵活性。
- 抽象产品还支持抽象工厂模式的关键特性,即创建不同产品族的对象。不同产品族的抽象产品可以通过不同的抽象工厂来创建。
抽象产品是抽象工厂模式中的核心概念之一,它定义了一组相关产品的通用接口,具有高度的抽象性,不包含具体的实现细节。抽象产品的存在有助于实现客户端与产品的解耦,并支持创建不同产品族的对象。通过使用抽象产品,设计模式能够提供更灵活、可扩展和可维护的系统结构。
🦋1.4 具体产品(Concrete Product)
抽象工厂模式(Abstract Factory Pattern)中的具体产品(Concrete Product)是抽象产品(Abstract Product)的具体实现,它表示一组相关产品中的一个具体实例。以下是具体产品的概念和作用:
概念:
- 具体产品是抽象工厂模式中的一部分,它是抽象产品的具体实现类。
- 每个具体产品类对应于抽象产品中定义的接口或抽象类,实现了这些接口或继承了抽象类,并提供了具体的实现细节。
- 具体产品类可以包含产品的具体属性和方法,用于描述产品的特性和行为。
作用:
- 具体产品的主要作用是实现抽象产品定义的接口或抽象类,以提供具体的产品实现。
- 具体产品类的存在使得客户端代码可以通过抽象工厂创建具体产品的实例,而无需关心具体产品类的名称或细节。
- 具体产品类的多态性使得客户端能够以统一的方式处理不同产品的实例,从而提高了系统的灵活性和可维护性。
- 具体产品类的实现可以根据不同的工厂选择,从而支持创建不同产品族的对象,这有助于保持产品之间的一致性和关联性。
具体产品是抽象工厂模式中的具体实现,它们实现了抽象产品定义的接口或抽象类,并提供了产品的具体实现细节。具体产品的存在使得客户端能够创建和操作不同种类的产品对象,同时不需要了解具体产品类的细节,从而实现了高度的抽象和解耦。这种结构使得抽象工厂模式能够轻松支持创建不同产品族的对象,从而满足不同的需求。
🔎2.示例
命名空间AbstractFactory中包含手机基类MobilePhone、便携式设备基类Tablet和计算机基类Computer,以及它们对应的6个实现类。抽象设备工厂类DeviceFactory包含2个实现类中国工厂ChineseFactory类和美国工厂AmericanFactory类。在智能设备竞争如此激烈的今天,我将尝试用2个不同的工厂来生产一批智能设备,以使大家能够了解抽象工厂模式的正确使用方法。
public abstract class MobilePhone {
public abstract void Print();
}
抽象手机类MobilePhone,产品族中的一员。
public class ApplePhone : MobilePhone {
public override void Print() {
Console.WriteLine("Apple Phone is created by American Factory!");
}
}
苹果手机实现类ApplePhone,具体的产品。
public class HuaWeiPhone : MobilePhone {
public override void Print() {
Console.WriteLine("HuaWei Phone is created by Chinese Factory!");
}
}
华为手机实现类HuaWeiPhone,具体的产品。
public abstract class Computer {
public abstract void Print();
}
抽象计算机类Computer,产品族中的一员。
public class DellComputer : Computer {
public override void Print() {
Console.WriteLine("Dell Computer is created by American Factory!");
}
}
戴尔计算机实现类DellComputer,具体的产品。
public class LenovoComputer : Computer {
public override void Print() {
Console.WriteLine("Lenovo Computer is created by Chinese Factory!");
}
}
联想计算机实现类LenovoComputer,具体的产品。
public abstract class Tablet {
public abstract void Print();
}
抽象便携式设备类Tablet,产品族中的一员。
public class Nexus10 : Tablet {
public override void Print() {
Console.WriteLine("Nexus10 is created by American Factory!");
}
}
Nexus10便携式设备实现类Nexus10,具体的产品。
public class XiaoMiPad : Tablet {
public override void Print() {
Console.WriteLine("XiaoMiPad is created by Chinese Factory!");
}
}
小米平板便携式设备实现类XiaoMiPad,具体的产品。
public abstract class DeviceFactory {
public abstract MobilePhone CreateMobilePhone();
public abstract Computer CreateComputer();
public abstract Tablet CreatePad();
}
智能设备生产工厂基类,它定义了一个产品族的生成接口,这是区别于工厂方法模式的主要模块。
public class AmericanFactory : DeviceFactory {
public override MobilePhone CreateMobilePhone() {
return new ApplePhone();
}
public override Computer CreateComputer() {
return new DellComputer();
}
public override Tablet CreatePad() {
return new Nexus10();
}
}
美国工厂类AmericanFactory,是一个具体的智能设备生产工厂。
public class ChineseFactory : DeviceFactory {
public override MobilePhone CreateMobilePhone() {
return new HuaWeiPhone();
}
public override Computer CreateComputer() {
return new LenovoComputer();
}
public override Tablet CreatePad() {
return new XiaoMiPad();
}
}
中国工厂类ChineseFactory,是一个具体的智能设备生产工厂。
public class CreateDevice<T> where T : DeviceFactory {
private static T _deviceFactory = null;
public static void Create() {
_deviceFactory = Activator.CreateInstance<T>();
_deviceFactory.CreateMobilePhone().Print();
_deviceFactory.CreateComputer().Print();
_deviceFactory.CreatePad().Print();
}
}
一个辅助类,帮助我生产智能设备并向命令行输出结果。
public class Program {
public static void Main(string[] args) {
CreateDevice<ChineseFactory>.Create();
CreateDevice<AmericanFactory>.Create();
Console.ReadKey();
}
}
以上是调用方的代码,以下是这个案例的输出结果:
HuaWei Phone is created by Chinese Factory!
Lenovo Computer is created by Chinese Factory!
XiaoMiPad is created by Chinese Factory!
Apple Phone is created by American Factory!
Dell Computer is created by American Factory!
Nexus10 is created by American Factory!
🚀总结
🔎1.优点
抽象工厂模式(Abstract Factory Pattern)具有多个优点,这些优点使它成为一种有力的设计模式,特别适用于需要创建一组相关对象的情况。以下是抽象工厂模式的主要优点:
抽象性和灵活性:抽象工厂模式引入了一层抽象,客户端代码只需要与抽象工厂和抽象产品接口交互,而不需要关心具体的产品类。这提高了系统的抽象性和灵活性,使得可以轻松切换不同的具体工厂来创建不同的产品族。
解耦性:抽象工厂模式将产品的创建和使用分离开来,客户端代码不需要了解具体产品的实现细节,从而实现了解耦。这降低了代码之间的依赖性,使系统更容易维护和扩展。
一致性:抽象工厂模式确保创建的产品属于同一产品族,因此这些产品之间具有一致性和关联性。这对于需要一组相关产品协同工作的场景非常有用。
易于替换:由于客户端代码仅依赖于抽象工厂和抽象产品接口,所以可以轻松替换具体工厂以更改系统的行为,而无需修改客户端代码。
支持多态性:抽象工厂模式提供了多态性的支持,客户端可以以统一的方式处理不同产品的实例,从而提高了代码的可维护性和可扩展性。
便于添加新产品:如果需要添加新的产品,只需创建新的具体产品类和相应的具体工厂类即可,而不会影响现有代码的稳定性。
符合开闭原则:抽象工厂模式符合开闭原则,因为它允许增加新的产品族而无需修改已有的代码。这有助于保持系统的稳定性和可维护性。
抽象工厂模式通过提供一种抽象的产品创建机制,支持创建一组相关对象,提高了系统的抽象性、灵活性、可维护性,并降低了代码之间的耦合度。这使得它在需要处理多个相关对象的场景中非常有用。
🔎2.缺点
抽象工厂模式(Abstract Factory Pattern)虽然有许多优点,但也存在一些缺点,需要在使用时考虑。以下是抽象工厂模式的主要缺点:
复杂性增加:引入抽象工厂模式会增加系统的复杂性。因为需要定义抽象工厂、抽象产品以及多个具体工厂和具体产品类,这可能导致类的数量增加,使系统变得更加复杂和难以维护。
扩展困难:如果需要添加新的产品族或修改现有的抽象工厂接口,可能需要修改所有与之相关的具体工厂和具体产品类。这可能导致扩展时的困难,尤其在已有的大型系统中。
固定产品族:抽象工厂模式适用于创建一组相关的产品,但如果需要在运行时动态地选择产品族,这将变得复杂。通常,抽象工厂模式在设计时就已经确定了产品族,难以在运行时进行切换。
性能开销:使用抽象工厂模式可能会引入一些性能开销,因为客户端需要通过工厂来创建产品,而不是直接实例化产品对象。这可能在某些性能敏感的应用中成为问题。
不适用于单一产品的情况:如果系统中只有一个产品族或只需要创建单一类型的产品,那么抽象工厂模式可能会显得过于繁琐,不是最优选择。此时,简单工厂或工厂方法模式可能更合适。
不易理解:抽象工厂模式的设计结构相对复杂,可能需要开发人员更多的时间来理解和实现,特别是对于初学者而言。
抽象工厂模式在需要处理一组相关产品的情况下非常有用,但也需要权衡其复杂性和灵活性。在设计时,需要仔细考虑是否真正需要使用抽象工厂模式,以及是否存在更简单的设计模式来满足需
🔎3.使用场景
抽象工厂模式(Abstract Factory Pattern)适用于以下情况,特别是在需要创建一组相关的产品对象并确保它们之间的一致性时:
需要创建一组相关的产品:当系统需要一组具有相关特性或关联性的产品对象时,抽象工厂模式非常有用。例如,一个图形用户界面(GUI)库可能需要创建不同操作系统下的按钮、窗口和滚动条等相关组件。
希望将产品的创建和使用分离:抽象工厂模式将产品的创建和客户端的使用分离,客户端只需要与抽象工厂和抽象产品接口交互,而不需要了解具体产品的实现细节。这有助于降低代码之间的依赖性和提高系统的可维护性。
需要保持产品之间的一致性:如果产品之间需要保持一致性和关联性,即它们属于同一产品族,那么抽象工厂模式可以确保创建的产品是相关的,符合一致性要求。
需要支持多种不同的产品族:抽象工厂模式允许在不同的具体工厂中创建不同的产品族,因此在需要支持多种不同产品族的情况下,它非常有用。例如,可以有不同的具体工厂来创建不同风格的GUI组件。
易于扩展:如果系统需要在将来添加新的产品族或产品类型,抽象工厂模式可以使扩展变得相对容易。只需创建新的具体工厂和具体产品类,并确保它们遵循相应的抽象接口即可。
需要实现产品的多态性:抽象工厂模式提供了多态性的支持,客户端可以以统一的方式处理不同产品的实例,这有助于提高代码的可维护性和可扩展性。
抽象工厂模式适用于需要创建一组相关产品、需要保持产品一致性、需要将产品的创建和使用分离以及需要支持多种不同产品族的情况。它是一种有力的设计模式,特别适用于图形用户界面库、数据库驱动程序、操作系统抽象等需要处理一组相关对象的应用中。
🚀感谢:给读者的一封信
亲爱的读者,
我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。
如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。
我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。
如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。
再次感谢您的阅读和支持!
最诚挚的问候, “愚公搬代码”
- 点赞
- 收藏
- 关注作者
评论(0)