🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。 🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
设计模式(Design Pattern)是软件开发领域的宝贵经验,是多人反复借鉴和广泛应用的代码设计指导。它们是一系列经过分类和归纳的代码组织方法,旨在实现可重用性、可维护性和可理解性。使用设计模式,我们能够编写高质量的代码,使其更易于他人理解,并提供了代码可靠性的保证。
毫无疑问,设计模式对个人、团队和整个系统都带来了显著的益处。它们将代码开发提升到工程化水平,为软件工程构建提供了坚实的基础,就如同大厦的一块块精巧的砖石一样。在项目中明智地应用设计模式可以完美地解决各种复杂问题。每种设计模式都有相应的原理和最佳实践,它们描述了我们日常开发中不断遇到的问题,以及这些问题的核心解决方法。正是因为这种实用性和通用性,设计模式才能在软件开发中广泛地得以应用。设计模式是构建稳健、可扩展和可维护软件的关键工具,为开发者们提供了解决问题的智慧和指导。
工厂方法模式是一种创建型设计模式,其主要目的是将对象的创建过程延迟到子类中,让子类自己决定要实例化哪个具体工厂类。这个模式提供了一种灵活且可扩展的方式来创建对象,同时也保护了客户端代码免受对象创建细节的影响。
在工厂方法模式中,我们定义了一个创建对象的接口,通常称为工厂接口或创建者接口。每个具体的工厂类都实现了这个接口,并负责创建特定类型的对象。客户端代码通过调用工厂方法来获取对象,而不需要知道对象的具体创建逻辑。
这种模式的关键点在于,它将对象的创建过程委托给了子类,因此允许在不修改客户端代码的情况下引入新的具体产品类和工厂类。这使得系统更加可扩展和容易维护,同时也遵循了开闭原则,因为可以添加新的子类而无需修改现有的代码。
工厂方法模式提供了一种创建对象的最佳实践,通过将创建逻辑封装在子类中,实现了松耦合和高度可扩展的对象创建过程。
工厂方法模式(Factory Method Pattern)中的抽象工厂(Creator)是该模式的核心概念之一,其主要作用如下:
抽象工厂模式的核心作用是定义了一个创建对象的接口,将对象的创建过程延迟到具体的工厂子类中,实现了多态性、对象替代性和系统的可扩展性。这种模式常用于需要生产一组相关或兼容的产品对象,以满足不同客户端或配置的需求。它是一种强大的设计模式,特别适用于需要处理复杂对象家族的情况。
工厂方法模式(Factory Method Pattern)中的具体工厂(Concrete Creator)是一种具体的类,实现了抽象工厂(Creator)定义的工厂方法,用于创建具体的产品对象。具体工厂负责实例化特定类型的产品,它是工厂方法模式的关键组成部分,具有以下概念和作用:
具体工厂是工厂方法模式的实际工作者,负责实现工厂方法以创建特定类型的产品。它们在系统中扮演着关键的角色,通过将对象的创建过程封装在具体工厂中,实现了系统的灵活性和可扩展性。客户端代码通过与抽象工厂接口或抽象类交互,与具体工厂解耦,从而能够轻松应对不同类型的产品需求。
工厂方法模式(Factory Method Pattern)中的抽象产品(Product)是该模式的核心概念之一,其主要作用如下:
抽象产品在工厂方法模式中扮演了定义产品通用特征和接口的角色,它是产品家族中所有具体产品的公共基础。通过抽象产品,可以实现客户端代码与具体产品的解耦,支持多态性,同时也为具体工厂提供了一致的返回类型。这种模式使得系统更加灵活、可扩展,并符合开闭原则,因为可以添加新的具体产品类而不需要修改现有的代码。
工厂方法模式(Factory Method Pattern)中的具体产品(Concrete Product)是实际的产品类,它们是由具体工厂类(Concrete Creator)创建的对象,具体产品的概念和作用如下:
具体产品是工厂方法模式中的产品实现,它们具体定义了产品的行为和特征。不同的具体产品类代表了产品家族中的不同成员,通过抽象产品接口或抽象类与客户端代码进行交互,支持多态性和对象替代性。工厂方法模式通过具体产品的封装和抽象,实现了对象创建的多态性和可扩展性,使得系统更加灵活和易于维护。
命名空间FactoryMethod中包含Logger日志基类,4个具体日志类,分别为TextLogger文本日志类、BinaryLogger二进制日志类、DatabaseLogger数据库日志类和CloudLogger云日志类。另外包含一个LoggerFactory工厂基类,它又包含4个对应的工厂实现类。本案例尝试以一个日志记录器来讲述工厂方法模式的运作机制。
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!
工厂方法模式(Factory Method Pattern)具有多个优点,使其成为一种有用的设计模式,包括:
工厂方法模式提供了一种灵活、可扩展、易于维护的方式来处理对象的创建,使得系统更具弹性和可维护性。这使得它在各种应用中都有广泛的应用,特别是当需要处理多种产品类型或产品家族时,工厂方法模式尤为有
工厂方法模式(Factory Method Pattern)虽然有很多优点,但也存在一些缺点,需要考虑和权衡:
工厂方法模式适用于需要创建多个产品对象,并且这些产品对象属于一个产品家族的情况。然而,它不是一种适用于所有场景的设计模式,需要根据具体情况来权衡其优点和缺点,确保使用它能够提高系统的可维护性和扩展性,而不会引入不必要的复杂性。
工厂方法模式(Factory Method Pattern)适用于以下一些场景和情况:
工厂方法模式适用于需要创建多个产品对象,而且这些产品对象之间有一定的关联或兼容性,并且需要支持对象的多态性和替代性。它是一种有助于解耦和扩展的设计模式,特别适用于复杂的系统或需要频繁引入新