登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
设计模式(二)工厂方法
设计模式(二)工厂方法
[ 复制链接 ]
纣捎牟
2025-6-8 22:25:27
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
一、前言
工厂模式常见的词:简单工厂、工厂方法、抽象工厂。简单工厂不属于23种经典设计模式,但通常将它作为学习其他工厂模式的基础。
二、简单工厂
1、定义
定义一个工厂类,它可以根据参数的不同返回不同类型的实例,被创建的实例通常都具有共同的父类。由于简单的工厂模式中用于创建实例的方法通常是静态方法,所以简单工厂又被称作为静态工厂。
2、例子
例:开发一套图表库,根据不同的参数可以创建柱状图BarChart,直线图LineChart,饼状图PieChart,下面使用简单工厂来实现。
Chart:抽象图表接口,充当抽象产品类
namespace _02_FactoryMethod
{
internal interface Chart
{
void Display();
}
}
复制代码
BarChart:柱状图类,充当具体产品类
namespace _02_FactoryMethod
{
class BarChart : Chart
{
public BarChart()
{
Console.WriteLine("创建柱状图");
}
public void Display()
{
Console.WriteLine("显示柱状图");
}
}
}
复制代码
LineChart:折线图类,充当具体产品类
namespace _02_FactoryMethod
{
internal class LineChart : Chart
{
public LineChart()
{
Console.WriteLine("创建折线图");
}
public void Display()
{
Console.WriteLine("显示折线图");
}
}
}
复制代码
PieChart:饼图类,充当具体产品类
namespace _02_FactoryMethod
{
internal class PieChart : Chart
{
public PieChart()
{
Console.WriteLine("创建饼图");
}
public void Display()
{
Console.WriteLine("显示饼图");
}
}
}
复制代码
ChartFactory:图表工厂类,充当工厂类
namespace _02_FactoryMethod
{
internal class ChartFactory
{
public static Chart GetChart(string type)
{
Chart chart = null;
if (type.Equals("bar"))
{
chart = new BarChart();
}
else if (type.Equals("line"))
{
chart = new LineChart();
}
else if (type.Equals("pie"))
{
chart = new PieChart();
}
return chart;
}
}
}
复制代码
Program:测试代码
Chart chart = ChartFactory.GetChart("bar");
chart.Display();
复制代码
简单工厂也可以再简化,直接将抽象类和工厂类合并,因为并不是所有类型的产品都那么复杂。
3、总结
实际应用中,简单工厂肯定是难当大任的,工厂类职责过重,一旦出现问题,整个程序直接崩溃,而且产品类不易拓展,新增就意味着改代码。当然,如果只是一个简单程序,配合使用反射、配置文件等手段可以快速完成开发,相信大家都“吃过猪肉也见过猪跑”。
三、工厂方法
1、定义
定义一个用于创建对象的接口,但是让子类决定将哪一个实例化。工厂方法模式让一个类的实例化延迟到其子类,是一种创建型模式。与简单工厂相比,引入了抽象工厂角色。工厂方法模式包含以下四个角色:
1、Product(抽象产品):它是定义产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的公共父类。
2、ConcreteProduct(具体产品):它实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂和具体产品之间一一对应。
3、Factory(抽象工厂):在抽象工厂类中,声明了工厂方法(Factory Method),用于返回一个产品。抽象工厂是工厂方法模式的核心,所有创建对象的工厂类都必须实现该接口。
4、ConcreteFactory(具体工厂):它是抽象工厂类的子类,实现了在抽象工厂中声明的工厂方法,由客户端调用,返回一个具体产品类的实例。
2、例子
例:系统封装多种记录日志方式,包括文件记录日志、数据库记录日志等,可以根据需求切换。
LoggerFactory:抽象产品工厂接口,供具体产品(数据库记录日志、文件记录日志)工厂继承,实现创建具体产品类的方法
public interface LoggerFactory
{
public Logger CreateLogger();
}
复制代码
DataBaseLoggerFactory:数据库记录日志工厂类,继承抽象产品工厂接口
public class DataBaseLoggerFactory : LoggerFactory
{
public Logger CreateLogger()
{
//创建数据库业务代码略
Logger logger = new DataBaseLogger();
return logger;
}
}
复制代码
FileLoggerFactory:文件记录日志工厂类,继承抽象产品工厂接口
public class FileLoggerFactory : LoggerFactory
{
public Logger CreateLogger()
{
//创建文件业务代码略
Logger logger = new FileLogger();
return logger;
}
}
复制代码
Logger:抽象产品接口,供具体产品类继承,实现记录日志的具体方法
public interface Logger
{
void WriteLog();
}
复制代码
DataBaseLogger:数据库记录日志类,继承抽象产品
public class DataBaseLogger : Logger
{
public void WriteLog()
{
Console.WriteLine("数据库记录日志");
}
}
复制代码
FileLogger:文件记录日志类,继承抽象产品
public class FileLogger : Logger
{
public void WriteLog()
{
Console.WriteLine("文件记录日志");
}
}
复制代码
Program:客户端测试类
LoggerFactory loggerFactory = new DataBaseLoggerFactory();
Logger logger = loggerFactory.CreateLogger();
logger.WriteLog();
复制代码
3、总结
工厂方法模式除了包含简单工厂的优点,还弥补了不足,当需要添加新产品时,只需要添加一个具体工厂和具体产品即可,无需改动已有代码,增强系统可扩展性,符合开闭原则。当然这同时也增加了系统的理解难度,具体产品类过多的话,系统将变得无比庞大。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
设计模式
工厂
方法
相关帖子
解析设计模式与设计原则:构建可维护性和可扩展性代码的重要性
C#扩展方法或.net扩展方法
【EF Core】FromExpression 方法有什么用?
关于2233看板娘的配置方法
VonaJS AOP编程:魔术方法
笔记:不同进制的转换方法
Go语言实现GoF设计模式:适配器模式
告别盲人摸象,数据分析的抽样方法总结
使用ai的方法给epub文件中的汉字加拼音
在java中实现c#的int.TryParse方法
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
解析设计模式与设计原则:构建可维护性和可扩展性代码的重要性
3
545
涂流如
2025-10-11
安全
C#扩展方法或.net扩展方法
2
120
邹语彤
2025-10-14
业界
【EF Core】FromExpression 方法有什么用?
2
318
瞪皱炕
2025-10-14
业界
关于2233看板娘的配置方法
4
595
吕梓美
2025-10-18
业界
VonaJS AOP编程:魔术方法
4
375
喝岖
2025-10-23
安全
笔记:不同进制的转换方法
1
308
甘子萱
2025-11-08
安全
Go语言实现GoF设计模式:适配器模式
3
483
柩通奉
2025-11-19
业界
告别盲人摸象,数据分析的抽样方法总结
1
286
曲愍糙
2025-11-29
业界
使用ai的方法给epub文件中的汉字加拼音
0
244
叶芷雁
2025-12-08
安全
在java中实现c#的int.TryParse方法
0
818
歇凛尾
2025-12-09
回复
(1)
林鱼
3 天前
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
感谢,下载保存了
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
代码
科技
安全
签约作者
程序园优秀签约作者
发帖
纣捎牟
3 天前
关注
0
粉丝关注
25
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
anyue1937
9994893
kk14977
6845357
3934307807
991123
4
xiangqian
638210
5
韶又彤
9998
6
宋子
9983
7
闰咄阅
9993
8
刎唇
9993
9
俞瑛瑶
9998
10
蓬森莉
9951
查看更多
今日好文热榜
361
爬虫专栏:破解网站检测selenium反爬——“
833
开源项目分享:Gitee热榜项目 2025年12月第
49
意识的自反性:知者与作者之惑
680
docker学习笔记
763
docker学习笔记
683
咱们聊聊Spring循环依赖那点事儿:从“死锁
156
Python学习3
832
NCHU-数字电路模拟程序-23207332
234
LaTeX学习笔记:学术文档排版
217
昆明黄金店推荐:如何甄选“价值平权”的黄
936
微信支付集成_JSAPI
882
【AI编程】5分钟用AI复刻有BOSS战的《坦克
627
紧跟材料趋势,深耕专业工艺:上海芮生建设
665
FFmpeg开发笔记(九十四)基于Kotlin的国产
743
昆明旅游打卡必去:逛南亚风情园,别错过廖
881
大厂生存启示录:从“螺丝钉”到“金牌个人
217
AI编程工具策略
265
self introduction
53
白嫖最新ChatGPT和主流AI大模型,国内无限
70
Java关键字解析之volatile:可见性的守护者