C#设计模式之1-工厂方法模式
工厂方法模式(Factory Method Pattern)
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/389 访问。
工厂方法模式属于创建型模式,定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,仅仅是通过使用一个共同的接口来指向新创建的对象。
角色:
1、抽象工厂(Creator)
是工厂方法模式的核心角色,任何在模式中创建的对象的工厂类必须实现这个接口;
2、具体工厂(Concrete Creator)
这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象;
3、抽象产品(Product)
工厂方法模式所创建的对象的基类,也就是产品对象的共同父类或共同拥有的接口;
4、具体产品(Concrete Product)
这个角色实现了抽象产品角色所定义的接口。
示例:
命名空间FactoryMethod中包含Logger日志基类,4个具体日志类,分别为TextLogger文本日志类、BinaryLogger二进制日志类、DatabaseLogger数据库日志类和CloudLogger云日志类。另外包含一个LoggerFactory工厂基类,它又包含4个对应的工厂实现类。本案例尝试以一个日志记录器来讲述工厂方法模式的运作机制。
namespace FactoryMethod
public abstract class Logger {
public abstract void Log(string message);
}
抽象日志基类Logger。
public class TextLogger : Logger {
public override void Log(string message) {
Console.WriteLine($"INFO {DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff")}" +
$" [{this.LoggerType()}] {message}");
}
}
具体日志类,以文本形式记录日志。
public class BinaryLogger : Logger {
public override void Log(string message) {
Console.WriteLine($"INFO {DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff")}" +
$" [{this.LoggerType()}] {message}");
}
}
具体日志类,以二进制形式记录日志。
public class DatabaseLogger : Logger {
public override void Log(string message) {
Console.WriteLine($"INFO {DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff")}" +
$" [{this.LoggerType()}] {message}");
}
}
具体日志类,以数据库形式记录日志。
public class CloudLogger : Logger {
public override void Log(string message) {
Console.WriteLine($"INFO {DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff")}" +
$" [{this.LoggerType()}] {message}");
}
}
具体日志类,以云服务器形式记录日志。
public abstract class LoggerFactory {
public abstract Logger CreateLogger();
}
工厂基类,用于生产日志记录器。
public class TextFactory : LoggerFactory {
public override Logger CreateLogger() {
return new TextLogger();
}
}
public class BinaryFactory : LoggerFactory {
public override Logger CreateLogger() {
return new BinaryLogger();
}
}
public class DatabaseFactory : LoggerFactory {
public override Logger CreateLogger() {
return new DatabaseLogger();
}
}
public class CloudFactory : LoggerFactory {
public override Logger CreateLogger() {
return new CloudLogger();
}
}
4个具体工厂类,用于生成相应的日志记录器。
public static class Extentions {
public static string LoggerType(this Logger logger) {
return logger
.ToString()
.Replace(nameof(FactoryMethod) + ".", "")
.Replace(nameof(Logger), "");
}
}
定义了一个扩展,方便处理日志字符串。
public class Program {
private static LoggerFactory _factory = null;
private static Logger _logger = null;
public static void Main(string[] args) {
_factory = new TextFactory();
CreateLogger();
_factory = new BinaryFactory();
CreateLogger();
_factory = new DatabaseFactory();
CreateLogger();
_factory = new CloudFactory();
CreateLogger();
Console.ReadKey();
}
const string LOG_MESSAGE = "I logged a lot of {0} info!";
private static void CreateLogger() {
_logger = _factory.CreateLogger();
_logger.Log(string.Format(LOG_MESSAGE, _logger.LoggerType()));
}
}
以上是调用方的代码,首先需要维持日志和工厂基类,然后创建不同的日志记录器并记录日志内容。以下是这个案例的输出结果:
INFO 2018-07-20 06:17:02.871 [Text] I logged a lot of Text info!
INFO 2018-07-20 06:17:02.928 [Binary] I logged a lot of Binary info!
INFO 2018-07-20 06:17:02.932 [Database] I logged a lot of Database info!
INFO 2018-07-20 06:17:02.933 [Cloud] I logged a lot of Cloud info!
优点:
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/389 访问。
1、一个调用者想创建一个对象,只要知道其名称就可以了;
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以;
3、屏蔽产品生成的具体实现,调用者只关心产品的接口。
缺点:
1、每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖;
2、一个具体工厂只能创建一种具体产品。
使用场景:
1、当一个类不知道它所需要的对象的类时;
2、在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可;
3、当一个类希望通过其子类来指定创建对象时。
C#设计模式之1-工厂方法模式的更多相关文章
- 大话设计模式C++版——工厂方法模式
工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版——简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发—封闭原则,其主 ...
- IOS设计模式浅析之工厂方法模式(Factory Method)
概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何隔离出这个易变对象的变化,使得系统中“其它依赖该对象的对 ...
- [设计模式]<<设计模式之禅>>工厂方法模式
1 女娲造人的故事 东汉<风俗通>记录了一则神话故事:“开天辟地,未有人民,女娲搏黄土做人”,讲述的内容就是大家非常熟悉的女娲造人的故事.开天辟地之初,大地上并没有生物,只有苍茫大地,纯粹 ...
- java设计模式-----2、工厂方法模式
再看工厂方法模式之前先看看简单工厂模式 工厂方法模式(FACTORY METHOD)同样属于一种常用的对象创建型设计模式,又称为多态工厂模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的 ...
- C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型】
一.引言 在上一篇文章中我们讲解了过渡的一种模式叫做[简单工厂],也有叫[静态工厂]的,通过对简单工厂模式得了解,我们也发现了它的缺点,就是随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变化 ...
- 设计模式C++实现——工厂方法模式
模式定义: 工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类. 模式结构: Creator是一个类,它实现了全部操纵产品的方法,但不实现工厂方法 ...
- 大话设计模式Python实现-工厂方法模式
工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延时到其子类. #!/usr/bin/env python ...
- 【C#设计模式3】工厂方法模式
一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...
- 重学 Java 设计模式:实战工厂方法模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!
- 《Head First 设计模式》:工厂方法模式
正文 一.定义 工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个.工厂方法让类把实例化推迟到子类. PS:在设计模式中,"实现一个接口"泛指实现某个超类型(可 ...
随机推荐
- OSCP Learning Notes - WebApp Exploitation(4)
Local File Inclusion[LFI] Target Pentester Lab: Download from the following website: https://www.vul ...
- mysql数据delete后的数据恢复
误删除了一个订单,订单号为:D200711008, 现根据binlog对该订单数据进行恢复. 1. 查看binlog日志, 取最新的一个 mysql-bin.000635 show binary lo ...
- epic游戏平台如何启用认证器应用程序/二次验证码/谷歌身份验证器?
1.登陆epic游戏平台,找到二次验证绑定界面 登陆https://www.epicgames.com/store/zh-CN/, 点右上角用户头像-[账户]. 之后点-[密码与安全] 在[双重验证] ...
- 关于C# winform唤起本地已安装应用程序(测试win10,win7可用)
想要唤起本地已安装应用程序,我想到的有三种可行的方法: 第一种就是打开本地的快捷方式(有的应用可能没有快捷方式,但这种方法效率最高,可配合其他方法使用),快捷方式分为本地桌面快捷方式和开始菜单中的快捷 ...
- python下载及安装方法
打开 http://www.python.org 找到Downlodas 点击windows 下载安装
- 浅谈CSRF(Cross-site request forgery)跨站请求伪造
本文目录 CSRF是什么 CSRF攻击原理 CSRF攻击防范 CSRF是什么 CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack” ...
- 安装nginx1.10和状态模块
环境 操作系统: Centos7.2 内核: 3.10.0-327.el7.x86_64 nginx: nginx-1.10.0.tar.gz 安装: 1.安装依赖包 yum -y install g ...
- php imap 那些坑
今天调试php 接收邮件,遇见的几大坑! 第一,返回错误 关键字imap_open返回flase 原来{{$mailServer}:143}INBOX 的端口,不是根据outlook给的,,,,,是 ...
- 《Python编程第4版 下》高清PDF|百度网盘免费下载|Python基础编程
<Python编程第4版 下>高清PDF|百度网盘免费下载|Python基础编程 提取码:tz5v 当掌握Python的基础知识后,你要如何使用Python?Python编程(第四版)为这 ...
- linux 命令行 拯救萌新精简版
装上linux 真机而不会命令行简直是太难了(这是什么人间疾苦) 于是,来几个非常基础的命令行,给(像我这样)的萌新们一点点前进的动力,也给奋斗在linux路上的大佬们一点点来自萌新的敬意吧. 一个非 ...