设计模式(二)工厂方法
时间:2023-08-18 23:06:14来源:博客园

一、前言

工厂模式常见的词:简单工厂、工厂方法、抽象工厂。简单工厂不属于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、总结

工厂方法模式除了包含简单工厂的优点,还弥补了不足,当需要添加新产品时,只需要添加一个具体工厂和具体产品即可,无需改动已有代码,增强系统可扩展性,符合开闭原则。当然这同时也增加了系统的理解难度,具体产品类过多的话,系统将变得无比庞大。

标签:

最新
  • 设计模式(二)工厂方法

    一、前言**工厂模式常见的词:简单工厂、工厂方法、抽象工厂。简单工

  • 视源股份:截至8月10日,公司股东总户数为22,927户,感谢您的持续关注!

    视源股份(002841)08月17日在投资者关系平台上答复了投资者关心的问题。

  • 趣睡科技股东中哲磐石拟减持不超3.31%股份

    上证报中国证券网讯(记者骆民)趣睡科技公告,持公司股份1,323,732股

  • 梁树峰获批成为海尔消费金融CIO

    日前,国家金融监督管理总局青岛监管局发布一则任资公告显示,经审查,

  • 惩贪治腐正风肃纪!甘肃一市立案31件、处分20人!

    嘉峪关苗圃主任张振华、出纳李娟违规报销私车燃油费、违规使用公务加油

  • 美国长期国债收益率持续走高 银行业或承受更大压力

    中新社纽约8月15日电(记者王帆)当地时间15日,美国10年期国债收益率一

  • 智飞生物一结核病辅助诊断产品进入临床试验

    8月15日晚间,“中国民营疫苗第一股”重庆智飞生物(300122)公告,公

  • 陕西煤业(601225.SH):董事长杨照乾辞职

    格隆汇8月14日丨陕西煤业(601225 SH)公布,董事会近日收到董事长杨照乾

  • 太劲爆!疑似男星A某自慰录影曝光 全民都在猜猜猜~

    日前一则疑似某男艺人的自慰录影在SNS上曝光,引发广大民众的关注。长

  • 传闻:《彩虹六号:围攻》将推出士官长联动皮肤

    传闻:《彩虹六号:围攻》将推出士官长联动皮肤介绍了  8月15日,游

  • 河北涿州恢复供水

    8月15日,涿州市建投水务有限公司发布关于水源切换的通知:涿州市供水

  • 创元科技:公司目前暂未涉及氢能源领域

    2023年8月14日,创元科技(000551)在互动平台表示,公司全资子公司江

  • 福晟国际(00627.HK)拟8月31日举行董事会会议批准中期业绩

    格隆汇8月14日丨福晟国际(00627 HK)公告,公司将于2023年8月31日举行董

  • 鼓励不裁员或者少裁员 四川稳岗返还政策延至年底

    近日,记者从人力资源社会保障厅获悉,为鼓励企业不裁员或者少裁员,四

  • 京津冀同城商务区建设、招商引资……下半年红桥区这样推动经济社会高质量发展

    天津北方网讯:记者获悉,今年以来,红桥区全力推动京津冀同城商务区建

  • 哔哩哔哩:“莫言B站账号被封”系谣言

    每经AI快讯,哔哩哔哩微信公众号8月13日发文称,经核实,此前有用户冒

  • 旅游
    • 现在离婚都需要什么手续费

    • 《玉骨遥》重明的真身是什么揭秘 重明与时影关系介绍

    • 恒工精密:人均产出为同业均值两倍的连铸技术龙头 迎“需求 集中度”双增机遇丨IPO黄金眼

    • 我们村的“法律明白人” | 姚世雄:“邻里之间出现矛盾纠纷找我、遇到困难问我”