package main
import "fmt"
type UserType int
const (
FrontUser = iota
AdminUser
)
func UserFactory(userType UserType) interface{} {
switch userType {
case FrontUser:
return NewUser()
case AdminUser:
return NewAdmin()
default:
return NewUser()
}
}
type User struct {
Id int
Name string
Role string
}
func NewUser() *User {
return &User{19, "li-si", "user"}
}
type Admin struct {
Id int
Name string
Role string
}
func NewAdmin() *Admin {
return &Admin{0, "zhang-san", "admin"}
}
//----------------------------------
type CreatorFunc func(id int, name, role string) interface{}
func UserFactoryPlus(userType UserType) CreatorFunc {
switch userType {
case FrontUser:
return NewUserWithFunc()
case AdminUser:
return NewAdminWithFunc()
default:
return NewUserWithFunc()
}
}
func NewUserWithFunc() CreatorFunc {
return func(id int, name, role string) interface{} {
return &User{id, name, role}
}
}
func NewAdminWithFunc() CreatorFunc {
return func(id int, name, role string) interface{} {
return &Admin{id, name, role}
}
}
func main() {
admin := UserFactory(AdminUser).(*Admin)
fmt.Println(admin)
user := UserFactory(FrontUser).(*User)
fmt.Println(user)
admin = UserFactoryPlus(AdminUser)(1, "wang-wu", "admin").(*Admin)
fmt.Println(admin)
user = UserFactoryPlus(FrontUser)(23, "ma-liu", "user").(*User)
fmt.Println(user)
}
简单工厂模式
于 2022-11-14 21:28:42 首次发布