Das Fabrikmuster ist ein schöpferisches Entwurfsmuster.In dem Fabrikmuster bestimmt die Elternklasse, wie die Instanz erzeugt wird,bestimmt aber nicht die spezifische erzeugte Klasse.Die spezifische Verarbeitung wird vollständig der Unterklasse gegeben.
Das Factory-Muster besteht darin , das Template-Vorlagenmuster zu verwenden, um eine Factory zu erstellen, die Instanzen generiert. Aus diesem Grund müssen wir das Vorlagenmuster zuerst lernen, im Gegensatz zu anderen Bloggern, die das Lernen nach der Art des Entwurfsmusters in die letztere Kategorie einteilen.
Szenen
In dieser Ausgabe verwenden wir ein Programm zum Erstellen einer ID-Karte (IDCard), um das Werksmodell zu demonstrieren.
Grundtypen und Schnittstellen
Die alte Regel besteht darin, zuerst den grundlegenden Typ und die abstrakte Schnittstelle zu definieren.
Zuerst definieren wir eine Factory-Schnittstelle Factory und definieren drei Methoden: Create() zum öffentlichen Generieren von Instanzen, createProduct() für die tatsächlich generierten gekapselten Instanzen und registerProduct() zum Speichern zum Generieren von Instanzen
// 工厂接口
type Factory interface {
// 对外公开的构建实例的方法
Create(owner string) Product
// 实际生成实例的方法
createProduct(owner string) Product
// 保存已生成的实例
registerProduct(product Product)
}
Als nächstes kommt die Produktschnittstelle Product, die zwei Methoden definiert, eine ist die Methode GetOwner(), um den Produkthalter zu erhalten, und die andere ist die Use()-Methode, um das verwendete Produkt zu simulieren
// 产品接口
type Product interface {
// 获取产品持有人名字
GetOwner() string
// 使用
Use()
}
erreichen
Der nächste Schritt besteht darin, die spezifischen Typen zu definieren, die die obige Schnittstelle implementieren, nämlich die IDCardFactory, die Factory implementiert, und den IDCard-Typ, der Product implementiert
IDCardFactory
// 身份证工厂,实现了Factory接口
type IDCardFactory struct {
products []Product `json:"products,omitempty"`
}
func (f *IDCardFactory) Create(owner string) Product {
idCard := f.createProduct(owner)
f.registerProduct(idCard)
return idCard
}
func (f *IDCardFactory) createProduct(owner string) Product {
return &IDCard{owner: owner}
}
func (f *IDCardFactory) registerProduct(idCard Product) {
f.products = append(f.products, idCard)
}
Ausweis
// 身份证类型,实现了Product接口
type IDCard struct {
owner string `json:"owner,omitempty"`
}
func (c *IDCard) GetOwner() string {
return c.owner
}
func (c *IDCard) Use() {
fmt.Printf("使用了%s的身份证抢火车票!\n", c.owner)
}
prüfen
func main() {
var factory = &IDCardFactory{
products: make([]Product, 0), //golang在声明结构体时,不会为结构体内的字段申请内存空间
}
card1 := factory.Create("小明")
card1.Use()
card2 := factory.Create("小红")
card2.Use()
}
Testergebnisse
Der Code wurde auf Github hochgeladen: LyonNee/design_patterns_with_go: Golang-based design pattern code (github.com)