设计模式-抽象工厂模式
抽象工厂模式
一.什么是抽象工厂?
传统理解:抽象工厂模式是所有形态的工厂模式最为抽象和最具一般性的一一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。
个人理解:抽象工厂就是指返回多个抽象类中需要的具体子类的实例。(不管怎么做折腾目的是得到具体子类的实例。)
二.案例:
还是用皮具厂的例子把!
首先老板接到一订单,客户要求皮具厂生产皮包(钱包,旅行包,背包,电脑包),老板有两个工厂,都可以生产钱包,旅行包,背包,电脑包,于是乎,老板将订单分配给两个工厂,一个工厂生产钱包,一个工厂生产旅行包。
接下来我们就用编程来实现吧。
二.Demo:
为了大家能动脑动手,我就写了一个产品,大家可以再增加一个产品如:旅行包,背包,电脑包等等。
抽象工厂:增加一个产品的时候,直接在抽象工厂里增加一个抽象方法即可;
/// <summary> /// 抽象工厂 /// </summary> public abstract class AbstractFactory { /// <summary> /// 抽象方法(钱包) /// </summary> /// <returns></returns> public abstract AbstractProduct.AbstractProduct CreateWallet(); }
具体工厂:当增加一个产品时,增加一个具体工厂即可;
/// <summary> ///具体工厂(钱包) /// </summary> public abstract class WalletFactory : AbstractFactory_Demo.AbstractFactory.AbstractFactory { public override AbstractProduct.AbstractProduct CreateWallet() { return new Wallet(); } }
抽象产品:当增加一个产品时,增加一个抽象类即可;
/// <summary> /// 抽象产品(钱包) /// </summary> public abstract class AbstractProduct { public abstract void Make(); }
具体产品:增加一个产品时,增加一个具体产品类即可;
/// <summary> /// 具体产品(钱包) /// </summary> public class Wallet : AbstractProduct.AbstractProduct { /// <summary> ///重写抽象方法 /// </summary> public override void Make() { Console.WriteLine("钱包"); } }
调用:当增加了一个产品后,直接在这里可以切换;
class Program { static void Main(string[] args) { //通过反射(钱包) string assemblyName = "AbstractFactory_Demo"; string fullName = assemblyName + ".Wallet";//钱包 //string fullName = assemblyName + ".TravellingBag";//旅行包 //------上面这些大家可以放到配置文件里,是不是特简单,这样就会达到当增加一个产品的时候,不需修改之前产品的代码,只需增加产品即可--------// var s = Assembly.Load(assemblyName); var instance = s.CreateInstance(fullName); AbstractFactory_Demo.AbstractProduct.AbstractProduct product = (AbstractFactory_Demo.AbstractProduct.AbstractProduct)instance; product.Make(); Console.Read(); } }
三.注意:
1. 具体产品抽象出一个抽象产品;
钱包---------------包
2.具体工厂抽象出一个抽象工厂;
钱包工厂----------包工厂
逻辑与思维,质的变化。
---------逻辑思维
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构