登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
重温设计模式 --- 抽象工厂模式
重温设计模式 --- 抽象工厂模式
[ 复制链接 ]
郦惠
2025-6-6 20:44:50
引言
抽象工厂模式
一种创建型设计模式,它提供了一种方式来封装一组具有相同主题的工厂,而不必指定它们具体的类。这样,客户端代码就可以使用抽象工厂来创建一组相关的对象,而不必关心实际创建的具体类。
抽象工厂模式有以下几个主要角色:
抽象工厂(AbstractFactory):声明用于创建抽象产品的操作的接口。
工厂实现(ConcreteFactory):实现创建具体产品对象的操作。
抽象产品(AbstractProduct):声明产品对象类型的接口。
产品实现(Product):定义由相应的具体工厂创建的产品对象,实现AbstractProduct接口。
下面使用C#实现抽象工厂模式:
抽象工厂
定义一个抽象工厂接口,其中包含了创建不同产品的方法:
public interface IAbstractFactory
{
IProductA CreateProductA();
IProductB CreateProductB();
}
复制代码
工厂实现
定义具体的工厂类,实现抽象工厂接口:
public class ConcreteFactory1 : IAbstractFactory
{
public IProductA CreateProductA()
{
return new ConcreteProductA1();
}
public IProductB CreateProductB()
{
return new ConcreteProductB1();
}
}
public class ConcreteFactory2 : IAbstractFactory
{
public IProductA CreateProductA()
{
return new ConcreteProductA2();
}
public IProductB CreateProductB()
{
return new ConcreteProductB2();
}
}
复制代码
在上述示例中,我们定义了两个具体工厂类:ConcreteFactory1和ConcreteFactory2。这两个工厂类都实现了IAbstractFactory接口,并且分别提供了不同的产品实现。
抽象产品
public interface IProductA
{
string GetName();
}
复制代码
产品实现
public class ConcreteProductA1 : IProductA
{
public string GetName()
{
return "ProductA1";
}
}
public class ConcreteProductA2 : IProductA
{
public string GetName()
{
return "ProductA2";
}
}
public interface IProductB
{
string GetName();
}
public class ConcreteProductB1 : IProductB
{
public string GetName()
{
return "ProductB1";
}
}
public class ConcreteProductB2 : IProductB
{
public string GetName()
{
return "ProductB2";
}
}
复制代码
下面,我们可以使用抽象工厂来创建一组相关的对象:
public class Client
{
private IAbstractFactory factory;
public Client(IAbstractFactory factory)
{
this.factory = factory;
}
public void Run()
{
var productA = factory.CreateProductA();
var productB = factory.CreateProductB();
Console.WriteLine(productA.GetName());
Console.WriteLine(productB.GetName());
}
}
static void Main(string[] args)
{
var client1 = new Client(new ConcreteFactory1());
client1.Run();
var client2 = new Client(new ConcreteFactory2());
client2.Run();
}
复制代码
输出:
ProductA1
ProductB1
ProductA2
ProductB2
复制代码
总结
上面的示例中,我们使用抽象工厂模式来创建了一组相关的对象,但是需要注意的是,它适用于创建一组相关的产品对象,但是当产品族的变化引起整个工厂等级结构的变化时,抽象工厂模式就不适用了。
此外,抽象工厂模式还存在一些缺点,例如:
新增产品会导致工厂接口的扩展。如果需要新增产品,就需要修改所有的工厂类,这会带来一些不必要的麻烦。
可能会导致类层次结构的复杂度增加。如果有多个产品族,就需要定义多个工厂接口,这会增加类层次结构的复杂度。
因此,在使用抽象工厂模式时,需要根据具体情况进行权衡和选择。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
重温
设计模式
抽象
工厂
模式
相关帖子
C# 弃元模式:从语法糖到性能利器的深度解析
软件设计模式系列之四——简单工厂模式
三类代码协同模式,你要如何选?
解析设计模式与设计原则:构建可维护性和可扩展性代码的重要性
Stimulsoft 报表脚本执行模式风险与防护建议
CRC32的直接和反转模式
freeswitch的proxy_media模式下video流的问题与修正
《丹纳赫模式:美的、复星都在学的战略并购与DBS系统》读书笔记
RFSOC学习记录(六)混频模式分析
【RabbitMQ】RPC模式(请求/回复)
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
C# 弃元模式:从语法糖到性能利器的深度解析
1
82
南宫玉英
2025-10-10
安全
软件设计模式系列之四——简单工厂模式
1
1016
愆蟠唉
2025-10-10
安全
三类代码协同模式,你要如何选?
0
356
跟尴
2025-10-10
安全
解析设计模式与设计原则:构建可维护性和可扩展性代码的重要性
1
495
涂流如
2025-10-11
业界
Stimulsoft 报表脚本执行模式风险与防护建议
0
151
讣丢
2025-10-17
安全
CRC32的直接和反转模式
0
572
蒲善思
2025-10-17
业界
freeswitch的proxy_media模式下video流的问题与修正
0
961
唐茗
2025-10-17
业界
《丹纳赫模式:美的、复星都在学的战略并购与DBS系统》读书笔记
2
476
师悠逸
2025-10-23
业界
RFSOC学习记录(六)混频模式分析
1
622
指陡
2025-10-24
业界
【RabbitMQ】RPC模式(请求/回复)
0
259
普料飕
2025-11-01
回复
(1)
胁冉右
2025-10-13 00:41:55
回复
使用道具
举报
照妖镜
很好很强大 我过来先占个楼 待编辑
vip免费申请,1年只需15美金$
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
代码
程序
教程
软件
科技
签约作者
程序园优秀签约作者
发帖
郦惠
2025-10-13 00:41:55
关注
0
粉丝关注
20
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
anyue1937
9994893
dage888
999994
3934307807
992122
4
xiangqian
638210
5
刎唇
9993
6
荡俊屯
9948
7
匝抽
9986
8
二艰糖
9970
9
宓碧莹
9988
10
游瞠离
9974
查看更多