设计模式之工厂方法的隐藏

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Reflection;//导入命名空间(记得在解决方案资源管理器里的“引用”中添加“System.Configuration”)

//工厂方法模式实例--配置文件与反射
namespace Factory_event
{
    class Program
    {
        static void Main(string[] args)
        {
           /* {//日志记录器工厂为接口时
                Console.WriteLine("工厂方法模式实例--配置文件与反射:");
                LoggerFactory factory;//针对抽象工厂类编程
                Logger logger;        //针对抽象产品类编程
                //读取配置文件
               string factoryString = ConfigurationManager.AppSettings["factory"];
                //反射生成对象
                factory = (LoggerFactory)Assembly.Load("Factory_event").CreateInstance(factoryString);
                logger = factory.CreateLogger();
                logger.WriteLog();
            }*/
            {//工厂方法的隐藏
                LoggerFactory factory;//针对抽象工厂类编程
                //读取配置文件
                string factoryString = ConfigurationManager.AppSettings["factory"];
                //反射生成对象
                factory = (LoggerFactory)Assembly.Load("Factory_event").CreateInstance(factoryString);
                factory.WriteLog();
            }
            /*//工厂方法重载
            {
                hload_LoggerFactory h_factory =new hload_DatabaseLoggerFactory();
                logger=h_factory.CreateLogger();
                logger.WriteLog();
                logger=h_factory.CreateLogger("123");
                logger.WriteLog();
            }*/
            

            Console.Read();
            /*总结:
             * (1)新增的日志记录器需要继承抽象日志器类Logger
             * (2)增加一个新的具体日志记录器工厂,继承抽象日志记录器工厂类LoggerFactory
             * --并实现其中工厂方法CreateLogger(),返回具体的日志记录器对象
             * (3)修改配置文件App.config,以新增具体的日志记录器工厂类的类名字符串替换原有的工厂类名字符串
             * (4)编译运行--使用新的日志记录器方式,而原有的类库代码无须做任何修改,完全符合开闭原则
             * 待续
             */
        }
    }

    /// <summary>
    /// 日志记录接口,充当抽象产品角色
    /// </summary>
    internal interface Logger
    {
        void WriteLog();
    }
    /// <summary>
    /// 数据库日志记录器,充当具体产品角色
    /// </summary>
    class DatabaseLogger : Logger
    {

        public void WriteLog()
        {
            Console.WriteLine("数据库记录日志");
        }
    }
    /// <summary>
    /// 文件日志记录器,充当具体产品角色
    /// </summary>
    class FileLogger : Logger
    {
        public void WriteLog()
        {
            Console.WriteLine("文件日志记录");
        }
    }

    /// <summary>
    /// 日志记录器工厂接口
    /// </summary>
    /* internal interface LoggerFactory
    {
        Logger CreateLogger();//抽象工厂方法
    }*/
    /// <summary>
    /// 日志记录器抽象工厂
    /// </summary>
    internal abstract class LoggerFactory
    {
        public void WriteLog()
        {
            Logger logger= this.CreateLogger();
            logger.WriteLog();
        }

        public abstract Logger CreateLogger();
    }

    /// <summary>
    /// 数据库日志记录器工厂类,充当具体工厂角色
    /// </summary>
    class DatabaseLoggerFactory : LoggerFactory
    {
        public override Logger CreateLogger()
        {
            //连接数据库
            //创建数据库日志记录对象
            Logger logger = new DatabaseLogger();
            //初始化数据库日志记录器
            return logger;
        }
        /*
        public Logger CreateLogger()
        {
            //连接数据库
            //创建数据库日志记录对象
            Logger logger = new DatabaseLogger();
            //初始化数据库日志记录器
            return logger;
        }
          */
    }
    /// <summary>
    /// 文件日志记录器工厂类,充当具体工厂角色
    /// </summary>
    class FileLoggerFactory : LoggerFactory
    {
        public override Logger CreateLogger()
        {
            //创建日志记录器对象
            Logger logger = new FileLogger();
            //创建文件
            //...
            return logger;
        }
        /*
        public Logger CreateLogger()
        {
            //创建日志记录器对象
            Logger logger = new FileLogger();
            //创建文件
            //...
            return logger;
        }*/
    }


}
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="factory" value="Factory_event.FileLoggerFactory"/> 
  </appSettings>
</configuration>

总结:通过把业务方法调用移至工厂类中,可以使用工厂类对象来调用产品对象的业务方法,客户端无须使用工厂方法来创建对象。

原文地址:https://www.cnblogs.com/lbonet/p/7159834.html