首页 > 其他分享 >创建型:工厂模式

创建型:工厂模式

时间:2024-07-18 15:56:18浏览次数:5  
标签:return 创建 typ 模式 工厂 func type


工厂模式是创建一系列相关对象的模式。

实现

如果我们要创建一系列相关的对象,如下:

package logger

import (
	"fmt"
)

type Logger interface {
	PrintLog()
}

type PdfLogger struct{}
type HTMLLogger struct{}
type DocLogger struct{}

func (pl PdfLogger) PrintLog() {
	fmt.Println("pdf log")
}

func (pl HTMLLogger) PrintLog() {
	fmt.Println("html log")
}

func (pl DocLogger) PrintLog() {
	fmt.Println("doc log")
}

func NewLogger(typ string) Logger {
	if typ == "pdf" {
		return PdfLogger{}
	}

	if typ == "html" {
		return HTMLLogger{}
	}

	if typ == "doc" {
		return DocLogger{}
	}

	return nil
}

NewLogger 函数中通过类型确定要创建什么样的对象。这是合理的,如果对象过于多,创建比较复杂的话。我们可以将 NewLogger 抽象为一个工厂类,由该类负责对象的创建。如下:

type LoggerFactory struct{}

func (lf LoggerFactory) CreateLogger(typ string) Logger {
	if typ == "pdf" {
		return PdfLogger{}
	}

	if typ == "html" {
		return HTMLLogger{}
	}

	if typ == "doc" {
		return DocLogger{}
	}

	return nil
}

客户端通过创建工厂对象,将类型传递给工厂对象即可获取想要的对象。对于客户端,这一创建过程是不感知的。

这就是简单工厂,简单工厂的优点是简单,缺点是如果需要新增对象,比如新增 JsonLogger 时,会更新工厂的 CreateLogger 方法。违反了开放封闭原则。

如果新增对象比较多,且类型是相关的,则可以考虑将工厂类抽象,由具体工厂类创建对象。如下:

type LoggerFactory interface {
	CreateLogger() Logger
}

type PdfLoggerFactory struct{}
type HTMLLoggerFactory struct{}
type DocLoggerFactory struct{}

func (plf PdfLoggerFactory) CreateLogger() Logger {
	return PdfLogger{}
}

func (hlf HTMLLoggerFactory) CreateLogger() Logger {
	return HTMLLogger{}
}

func (dlf DocLoggerFactory) CreateLogger() Logger {
	return DocLogger{}
}

这就是工厂方法模式,这样做的优点是遵循开放封闭原则,新增对象只需要更新相应的工厂类就行,不需要对现有代码做修改,缺点是相对复杂。

还有一点是,判断逻辑并没有移除,这里需要判断的就从创建哪个对象,变成了创建哪个对象的工厂。

对于抽象工厂平时用的不多,不过多介绍了。

Kubernetes 中的工厂模式

工厂模式在 Kubernetes 中的典型应用是创建 informer 对象。如下:

informerFactory := informers.NewSharedInformerFactory(clientset, controller.NoResyncPeriodFunc())

dsc, err := NewDaemonSetsController(
    ctx,
    informerFactory.Apps().V1().DaemonSets(),
    informerFactory.Apps().V1().ControllerRevisions(),
    informerFactory.Core().V1().Pods(),
    informerFactory.Core().V1().Nodes(),
    ...
)

NewSharedInformerFactory 创建 sharedInformerFactory 工厂类,该工厂类实现 SharedInformerFactory 接口,负责创建 SharedInformer

调用工厂类的不同方法可以创建不同类型的 informer,如 DaemonSetInformerPodInformer 等。

我们可以看见某种程度上虽然抽象出了接口,不过 sharedInformerFactory 更类似于简单工厂的实现。


标签:return,创建,typ,模式,工厂,func,type
From: https://www.cnblogs.com/xingzheanan/p/18309743

相关文章

  • 设计模式之适配器模式(学习笔记)
    定义 适配器模式是一种结构型设计模式,它允许将一个类的接口转换为客户端希望的另一个接口。适配器使得原本由于接口不兼容而不能一起工作的类可以协同工作。通过创建适配器类,可以将现有类的接口转换成目标接口,从而使这些类能够在一起工作。为什么使用适配器模式兼容性适......
  • 2024北京国际智能工厂及自动化展览会亮点前瞻
    随着“工业创新,智造未来”的浪潮席卷而来,2024年度北京国际智能工厂及自动化与工业装配展览会定于8月1日至3日在中国国际展览中心(顺义新馆)盛大开幕。本次展会汇聚了智能制造与自动化技术的最新成果,通过三展联动的创新模式,搭建了一个集展示、交流、合作于一体的国际化平台。在“......
  • java23种设计模式!附源码
            本文将详细介绍Java中常见的23种设计模式、应用场景、优缺点、代码示例。包括单例模式、工厂模式、建造者模式、原型模式、适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式、代理模式、职责链模式、状态模式、策略模式、模板方法模式、观察者......
  • Python数据可视化之numpy的11个常用的创建数组的函数
    numpy库在处理成千上万的数据时,Python的1维列表已经不适合来对数据进行处理,效率会很慢,所以numpy就诞生了,他可以将列表变成数组,而数组可以是1维、2维、3维甚至更高纬度,可用于存储和处理大型的矩阵,此外numpy提供了大量的数学函数,包括数学、逻辑、形态操作、排序、选择,输出和......
  • java创建线程池的几中方式
    1.创建线程池四种方式使用Executors类,Executors类是Java中用于创建线程池的工厂类,它提供了多种静态方法来创建不同类型的线程池使用ThreadPoolExecutor类,ThreadPoolExecutor是Java中线程池的一个核心类,它提供了更细粒度的控制来创建和管理线程池使用Future和......
  • C# 使用模式匹配的好处,因为好用所以推荐~
    类型检查和转换:当你需要检查对象是否为特定类型,并且希望在同一时间内将其转换为那个类型时,模式匹配提供了一种更简洁的方式来完成这一任务,避免了使用传统的as和is操作符后还需要进行额外的null检查。复杂条件逻辑:在处理复杂的条件逻辑时,特别是涉及到多个条件和类型的情况下,使......
  • Spring与设计模式实战之策略模式
    Spring与设计模式实战之策略模式引言在现代软件开发中,设计模式是解决常见设计问题的有效工具。它们提供了经过验证的解决方案,帮助开发人员构建灵活、可扩展和可维护的系统。本文将探讨策略模式在Spring框架中的应用,并通过实际例子展示如何通过Spring的特性来实现和管理策......
  • 论如何直接用EF Core实现创建更新时间、用户审计,自动化乐观并发、软删除和树形查询(上)
    前言数据库并发,数据审计和软删除一直是数据持久化方面的经典问题。早些时候,这些工作需要手写复杂的SQL或者通过存储过程和触发器实现。手写复杂SQL对软件可维护性构成了相当大的挑战,随着SQL字数的变多,用到的嵌套和复杂语法增加,可读性和可维护性的难度是几何级暴涨。因此如何在实......
  • 【Web服务与Web应用开发】【C#】VS2019 创建ASP.NET Web应用程序,以使用WCF服务
    目录0.简介1.环境2.知识点3.详细过程1)创建空项目2)添加Web表单3)使用Web表单的GUI设计4)添加服务引用5)在Web的button函数中调用服务,获取PI值6)测试0.简介本文属于一个系列中的第二篇文章,这个系列会实现一个项目,这个项目主要使用VisualStudio2019作为开发工具,创建WC......
  • LangChain补充二:LCEL和Runnable更加方便的创建调用链
    https://www.alang.ai/langchain/101/lc05一:LCEL入门LangChain的设计围绕着让AI应用开发者能够方便地将多个流程连缀成一个AI应用的业务逻辑,包括Chain与Agent。每个流程都被封装成一个runnable(langchain_core.runnables),包括提示语模板、模型调用、输出解析器、工具......