纣捎牟 发表于 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、总结

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

林鱼 发表于 2025-12-11 14:27:53

感谢,下载保存了

咚獭 发表于 2026-1-9 17:31:02

收藏一下   不知道什么时候能用到

靛尊 发表于 2026-1-11 16:28:53

东西不错很实用谢谢分享

豌畔丛 发表于 2026-1-14 18:07:14

谢谢楼主提供!

窖咎 发表于 2026-1-15 20:07:22

yyds。多谢分享

煞赶峙 发表于 2026-1-18 00:21:54

过来提前占个楼

喳谍 发表于 2026-1-18 04:35:44

感谢分享,学习下。

娄静曼 发表于 2026-1-19 06:26:12

懂技术并乐意极积无私分享的人越来越少。珍惜

井晶灵 发表于 2026-1-21 01:58:29

过来提前占个楼

裴竹悦 发表于 2026-1-21 02:41:56

感谢分享,学习下。

桂册 发表于 2026-1-21 12:58:32

懂技术并乐意极积无私分享的人越来越少。珍惜

狭踝仇 发表于 2026-1-25 07:06:54

感谢分享,学习下。

习和璧 发表于 2026-1-28 07:40:20

感谢分享

湛恶 发表于 2026-1-30 03:21:52

感谢分享

恿榫 发表于 2026-1-30 05:34:46

感谢,下载保存了

猷咎 发表于 2026-2-1 02:25:36

过来提前占个楼

崔和美 发表于 2026-2-2 01:49:55

用心讨论,共获提升!

轩辕娅童 发表于 2026-2-2 05:05:41

鼓励转贴优秀软件安全工具和文档!

枢覆引 发表于 2026-2-4 07:39:17

喜欢鼓捣这些软件,现在用得少,谢谢分享!
页: [1] 2
查看完整版本: 设计模式(二)工厂方法