工厂模式是创建一系列相关对象的模式。
实现
如果我们要创建一系列相关的对象,如下:
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
,如 DaemonSetInformer
,PodInformer
等。
我们可以看见某种程度上虽然抽象出了接口,不过 sharedInformerFactory
更类似于简单工厂的实现。
标签:return,创建,typ,模式,工厂,func,type From: https://www.cnblogs.com/xingzheanan/p/18309743