• 工厂方法模式


    工厂方法模式

    定义一个用于创建对象的接口,让子类决定实例化哪一个类
    类创建型模式 工厂父类负责定义创建产品对象的公共接口,工厂子类负责生成具体的产品对象

    模式结构图

    <>
    «interface»
    Product
    ConcreteProduct
    ConcreteFactory
    +FactoryMethod()
    «interface»
    Factory
    +FactoryMethod()

    Product:定义产品的接口
    ConcreteProduct:实现抽象产品接口
    Factory:抽象工厂 声明一个工厂方法
    ConcreteFactory:返回一个具体产品类的实例

    示例:日志记录器

    <>
    <>
    Client
    «interface»
    Logger
    +WriteLog()
    «interface»
    LoggerFactory
    +CreateLogger()
    DatabaseLogger
    +WriteLog()
    FileLogger
    +WriteLog()
    FileLoggerFactory
    +CreateLogger()
    DatabaseLoggerFactory
    +CreateLogger()

    //Logger

        interface Logger
        {
            void WriteLog();
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    //FileLogger

        class FileLogger : Logger
        {
            public void WriteLog()
            {
                Console.WriteLine("File");
            }
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    //DataBaseLogger

        class DataBaseLogger : Logger
        {
            public void WriteLog()
            {
                Console.WriteLine("DataBase");
            }
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    //LoggerFactory

        interface LoggerFactory
        {
            //工厂方法的重载
            Logger CreateLogger();
    
            Logger CreateLogger(string args);
    
    
            Logger CreateLogger(object obj);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    //DatabaseLoggerFactory

        class DatabaseLoggerFactory : LoggerFactory
        {
            public Logger CreateLogger()
            {
                //连接数据库 代码省略
                Logger logger = new DataBaseLogger();
                //初始化日志记录器 代码省略
                return logger;
            }
    
            public Logger CreateLogger(string args)
            {
                throw new NotImplementedException();
            }
    
            public Logger CreateLogger(object obj)
            {
                throw new NotImplementedException();
            }
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    //FileLoggerFactory

        class FileLoggerFactory : LoggerFactory
        {
            public Logger CreateLogger()
            {
                Logger logger = new FileLogger();
                //创建文件 代码省略
                return logger;
            }
    
            public Logger CreateLogger(string args)
            {
                throw new NotImplementedException();
            }
    
            public Logger CreateLogger(object obj)
            {
                throw new NotImplementedException();
            }
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    //client

                LoggerFactory factory;
                Logger logger;
                //读取配置文件
                string factoryType = ConfigurationManager.AppSettings["factory"];
    
                //反射生成对象
                factory = (LoggerFactory)Assembly.Load("FactoryMethod").CreateInstance(factoryType);
                logger = factory.CreateLogger();
                logger.WriteLog();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    Redis 技术整理
    TCP的三次握手和四次挥手
    Synchronized底层核心原理
    vue3版本网页小游戏
    网络安全观察报告 攻击态势
    025-为什么要用抽象类
    三百六十行行行出状元之短视频入门必备技巧——配音
    RabbitMQ如何确保消息发送 ? 消息接收?
    N32学习笔记2-GPIO使用和关闭JTAG打开SW调试模式
    解除OU屏蔽(EBS检查无法直接查询解决)
  • 原文地址:https://blog.csdn.net/baidu_24565387/article/details/126580793