登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
每日签到
每天签到奖励2圆-6圆
发帖说明
VIP申请
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
VIP申请
VIP网盘
网盘
联系我们
每日签到
道具
勋章
任务
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
设计模式(二)工厂方法
设计模式(二)工厂方法
[ 复制链接 ]
纣捎牟
2025-6-8 22:25:27
一、前言
工厂模式常见的词:简单工厂、工厂方法、抽象工厂。简单工厂不属于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、总结
工厂方法模式除了包含简单工厂的优点,还弥补了不足,当需要添加新产品时,只需要添加一个具体工厂和具体产品即可,无需改动已有代码,增强系统可扩展性,符合开闭原则。当然这同时也增加了系统的理解难度,具体产品类过多的话,系统将变得无比庞大。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
设计模式
工厂
方法
相关帖子
性能优化之母:为什么说“方法内联”是编译器优化中最关键的一步棋?
性能优化之母:为什么说“方法内联”是编译器优化中最关键的一步棋?
Django 懒加载实现方法
burpsuite_pro_v1.5.01安装方法
向量索引的混合查询方法,你选对了吗?
static 静态方法的特点和作用
指数估值-A股主流指数的估值方法
Linux性能分析工具和方法
设计模式之单例模式
ORA-01720 错误及解决方法
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
性能优化之母:为什么说“方法内联”是编译器优化中最关键的一步棋?
0
657
悯拄等
2025-08-11
业界
性能优化之母:为什么说“方法内联”是编译器优化中最关键的一步棋?
0
597
蜴间囝
2025-08-11
安全
Django 懒加载实现方法
0
830
处匈跑
2025-08-18
软件
burpsuite_pro_v1.5.01安装方法
0
85
新程序
2025-08-18
科技
向量索引的混合查询方法,你选对了吗?
0
200
后彼
2025-08-19
业界
static 静态方法的特点和作用
0
853
拼匍弦
2025-08-20
安全
指数估值-A股主流指数的估值方法
0
1014
全叶农
2025-08-25
业界
Linux性能分析工具和方法
0
130
眸胝
2025-09-01
安全
设计模式之单例模式
0
77
颖顿庐
2025-09-03
安全
ORA-01720 错误及解决方法
0
787
万妙音
2025-09-04
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
签约作者
程序园优秀签约作者
发帖
纣捎牟
2025-6-8 22:25:27
关注
0
粉丝关注
21
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
敖可
9984
杭环
9988
凶契帽
9988
4
氛疵
9988
5
黎瑞芝
9988
6
猷咎
9986
7
里豳朝
9986
8
肿圬后
9986
9
蝓俟佐
9984
10
虽裘侪
9984
查看更多