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

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>

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

时间: 2024-10-11 07:24:07

设计模式之工厂方法的隐藏的相关文章

设计模式二: 工厂方法(Factory Method)

设计模式二: 工厂方法(Factory Method) 简介 工厂方法模式是创建型模式的一种, 核心结构有四个角色: 抽象工厂,具体工厂,抽象产品,具体产品; 实现层面上,该模式定义一个创建产品的接口,将实际创建工作推迟到具体工厂类实现, 一个产品对应一个工厂, 这样的好处是当有新产品引入时可以不修改具体的工厂角色. 意图 定义了一个创建对象的接口,但由子类决定要实例化哪个类.工厂方法把实例化操作推迟到子类. 类图 实现 以汽车举例. 按照本模式核心的四个角色分别定义, 并增加模式调用角色(此处

设计模式之工厂方法模式

anticipate 预料 = except ant蚂蚁 ic ic卡 ip ip卡 ate吃 我没有预料到小蚂蚁把我的ic,ip卡吃掉了. robust 强壮的 = strong ro rong容祖儿  bu不  st石头 容祖儿不喜欢强壮的石头. maintain 维持 = keep main主要的(大陆)  tain 台湾 大陆和台湾维持着若即若离的关系. 设计模式之工厂方法模式 动机:     一个工厂方法factory method定义了一个接口来创建对象,但是让子类去选择创建哪一个,

设计模式之工厂方法

设计模式之工厂方法 当在项目开发阶段,要开发易扩展易维护的代码,工厂方法就能解决很大部分这个问题. 我们来举例说明, 比如公司有个A类库,我们开发项目很多地方需要调用A类, 如果不使用设计模式,那么每个用到A类的地方,我们都要 去new一个实例出来,那么当项目突然有一天,要把A类换成 B类,维护人员去改时才发现,要改的地方太多了,不小心一点就 可能影响到整个系统的功能. 那么我们使用工厂方法哪? 我们只需要创建一个工厂方法, 然后方法里new 一个实例,那么我们在项目开发里 用到A类时, 使用工

每天一个设计模式-5 工厂方法模式

每天一个设计模式-5 工厂方法模式 1.模式定义 定义一个用于创建对象的接口,让子类决定实例化那一个类,Factory Method使一个类的实例化延迟到其子类. 2.工厂方法模式解决问题的思路 工厂方法模式需要接口对象,那就定义一个方法来创建这个接口对象(工厂方法):可是事实上它自己是不知道如何创建这个接口对象的,没有关系,定义成抽象方法让子类来实现就可以了:这样这个对象本身就可以只是面向接口编程,而无需关心到底如何创建接口对象了. 3.实际问题 实现一个导出数据的功能,客户选择数据的导出格式

C#设计模式(3)——工厂方法模式

一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary> /// 菜抽象类 /// </summary> public abstract class Food { // 输出点了什么菜 public abstract void Print(); } /// <summary> /// 西红柿炒鸡蛋这道菜 /// </summary

03.设计模式_工厂方法模式

转载自:http://www.cnblogs.com/zhili/p/FactoryMethod.html 一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是--简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以解决简单工厂模式中存在的这个问题,下面就具体看看工厂模式是如何解决该问题的. 二.工厂方法模式的实现 工厂方法模式之所以可以解决简单工厂的模式,是因为它的实现把具体产品的创建推迟到子类中,此时

Java设计模式之工厂方法模式(转) 实现是抽象工厂?

Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织   2009-02-25   来源:IT168网站 文本Tag: 设计模式 Java [IT168 技术文章]          一 .工厂方法(Factory Method)模式 工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色

【设计模式】——工厂方法模式

工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使用一个类的实例化延迟到其子类.根据依赖倒转原则,我们把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法.然后,所有的要生产具体类的工厂,就去实现这个接口,这样,一个简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体生成对象的工厂.我们在要增加新的功能,就不需要更改原有的工厂类了,只需要增加此功能的运算类和相应的工厂类就可以了.这样整个工厂和产品系其实都没有修改的

【大话设计模式】—— 工厂方法模式

一.概念 想象一下我们的寻常见到的工厂,下一个订单,付了订金,一段时间后就能够提货.我们不须要知道工厂是用的什么机器,怎么安排工人的,从哪来的材料,只须要一个订单就好,工厂就能够依照其固定流水线做出我们所须要的产品.设计模式中也有类似的一个大神:工厂方法模式. 以下让我们来认识一下: 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 二.UML图 Product(抽象产品) ConcreteProduct(