登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
每日签到
每天签到奖励2圆-6圆
发帖说明
VIP申请
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
VIP申请
VIP网盘
网盘
联系我们
每日签到
道具
勋章
任务
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
设计模式(三)抽象工厂
设计模式(三)抽象工厂
[ 复制链接 ]
铝缉惹
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根本没有提供创建的方法,需要依次修改抽象工厂接口、具体皮肤工厂类,抽象工厂模式无法很好的解决此类问题,这也是该模式最大的缺点,所以不适合在产品等级结构不稳定的场景下使用。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
设计模式
抽象
工厂
相关帖子
【设计模式】工厂模式
【设计模式】外观模式
【工厂和策略设计模式妙用】解决接口选择与多重if-else 问题
没听说过设计模式?保姆级教程来了!
软件工厂:推动新质生产力的组织跃迁
抽象与性能:从 LINQ 看现代 .NET 的优化之道
抽象类VS接口:核心区别与实战选择
设计模式之单例模式
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
【设计模式】工厂模式
0
283
恙髡
2025-06-26
业界
【设计模式】外观模式
0
163
盒礁泅
2025-06-27
业界
【工厂和策略设计模式妙用】解决接口选择与多重if-else 问题
0
882
匣卒
2025-07-08
安全
没听说过设计模式?保姆级教程来了!
0
413
涣爹卮
2025-07-09
科技
软件工厂:推动新质生产力的组织跃迁
0
332
施婉秀
2025-07-25
业界
抽象与性能:从 LINQ 看现代 .NET 的优化之道
0
146
溥价
2025-08-02
业界
抽象类VS接口:核心区别与实战选择
0
844
站竣凰
2025-08-08
安全
设计模式之单例模式
0
77
颖顿庐
2025-09-03
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
签约作者
程序园优秀签约作者
发帖
铝缉惹
2025-6-9 00:23:50
关注
0
粉丝关注
13
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
敖可
9984
杭环
9988
凶契帽
9988
4
氛疵
9988
5
黎瑞芝
9988
6
猷咎
9986
7
里豳朝
9986
8
肿圬后
9986
9
蝓俟佐
9984
10
虽裘侪
9984
查看更多