登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
签到
每天签到奖励2-10圆
导读
排行榜
TG频道
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
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
复制代码
总结
上面的示例中,我们使用抽象工厂模式来创建了一组相关的对象,但是需要注意的是,它适用于创建一组相关的产品对象,但是当产品族的变化引起整个工厂等级结构的变化时,抽象工厂模式就不适用了。
此外,抽象工厂模式还存在一些缺点,例如:
新增产品会导致工厂接口的扩展。如果需要新增产品,就需要修改所有的工厂类,这会带来一些不必要的麻烦。
可能会导致类层次结构的复杂度增加。如果有多个产品族,就需要定义多个工厂接口,这会增加类层次结构的复杂度。
因此,在使用抽象工厂模式时,需要根据具体情况进行权衡和选择。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
重温
设计模式
抽象
工厂
模式
相关帖子
优化 if/else 的四种设计模式
设计模式之 Target/Action
命令模式的深度解析:从标准实现到TPL Dataflow高性能架构
架构师必备:缓存更新模式总结
今日主题:规范化理论-模式分解
[原创]《C#高级GDI+实战:从零开发一个流程图》第06章:繁琐?没扩展性?抽象!抽象!
C# 弃元模式:从语法糖到性能利器的深度解析
软件设计模式系列之四——简单工厂模式
三类代码协同模式,你要如何选?
解析设计模式与设计原则:构建可维护性和可扩展性代码的重要性
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
优化 if/else 的四种设计模式
0
599
湄圳啸
2025-09-29
安全
设计模式之 Target/Action
1
513
甦忻愉
2025-09-30
业界
命令模式的深度解析:从标准实现到TPL Dataflow高性能架构
0
787
愤血冒
2025-10-01
业界
架构师必备:缓存更新模式总结
0
531
那虻
2025-10-01
安全
今日主题:规范化理论-模式分解
0
629
县挫伪
2025-10-03
业界
[原创]《C#高级GDI+实战:从零开发一个流程图》第06章:繁琐?没扩展性?抽象!抽象!
1
178
遑盲
2025-10-06
业界
C# 弃元模式:从语法糖到性能利器的深度解析
0
25
南宫玉英
2025-10-10
安全
软件设计模式系列之四——简单工厂模式
0
961
愆蟠唉
2025-10-10
安全
三类代码协同模式,你要如何选?
0
301
跟尴
2025-10-10
安全
解析设计模式与设计原则:构建可维护性和可扩展性代码的重要性
0
454
涂流如
2025-10-11
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
郦惠
2025-6-6 20:44:50
关注
0
粉丝关注
20
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
anyue1937
9994888
dage888
999994
3934307807
993690
4
富账慕
10007
5
柴古香
9992
6
匝抽
9986
7
筒濂
9983
8
孙淼淼
9992
9
凌彦慧
9985
10
崔瑜然
9984
查看更多