简单工厂模式不属于 GoF 23 个经典设计模式,但通常将它作为学习其它工厂模式的基础。
定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。
因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,属于类创建型模式。
简单工厂模式包含 3 个角色:
在简单工厂模式中,客户端通过工厂类来创建一个产品类的实例,而无须直接使用 new 关键字来创建对象,它是工厂模式家族中最简单的一员。
云管平台(CMP)中需要对多种类型的虚拟机进行管理,例如:OpenStack、VMware、Aliyun 等。
可以使用工厂模式来创建不同类型的虚拟机对象。
缺点:
package main
import "fmt"
type VirtualMachine struct {
name string
vmType string
openstackField string
vmwareField string
aliyunField string
}
// 构造函数
func newVirtualMachine(name, vmType string) *VirtualMachine {
if vmType == "OpenStack" {
return &VirtualMachine{
name: name,
vmType: vmType,
openstackField: "OpenStack Field",
}
} else if vmType == "VMware" {
return &VirtualMachine{
name: name,
vmType: vmType,
openstackField: "VMware Field",
}
} else if vmType == "Aliyun" {
return &VirtualMachine{
name: name,
vmType: vmType,
openstackField: "Aliyun Field",
}
}
return nil
}
func (v VirtualMachine) create() {
if v.vmType == "OpenStack" {
fmt.Println("调用 OpenStack 接口 create 虚拟机 API")
fmt.Println("... 大量业务逻辑代码 ...")
} else if v.vmType == "VMware" {
fmt.Println("调用 VMware 接口 create 虚拟机 API")
fmt.Println("... 大量业务逻辑代码 ...")
} else if v.vmType == "Aliyun" {
fmt.Println("调用 Aliyun 接口 create 虚拟机 API")
fmt.Println("... 大量业务逻辑代码 ...")
}
}
func (v VirtualMachine) delete() {
if v.vmType == "OpenStack" {
fmt.Println("调用 OpenStack 接口 delete 虚拟机 API")
fmt.Println("... 大量业务逻辑代码 ...")
} else if v.vmType == "VMware" {
fmt.Println("调用 VMware 接口 delete 虚拟机 API")
fmt.Println("... 大量业务逻辑代码 ...")
} else if v.vmType == "Aliyun" {
fmt.Println("调用 Aliyun 接口 delete 虚拟机 API")
fmt.Println("... 大量业务逻辑代码 ...")
}
}
func main() {
vm := newVirtualMachine("OpenStack", "OpenStack")
vm.create()
}
优点:
package main
type VirtualMachineInterface interface {
create()
delete()
}
type VirtualMachine struct {
name string
vmType string
}
package main
import "fmt"
type OpenStackVirtualMachine struct {
VirtualMachine
openStackField string
}
func (vm OpenStackVirtualMachine) create() {
fmt.Println("调用 OpenStack 接口 create 虚拟机 API")
fmt.Println("... 大量业务逻辑代码 ...")
}
func (vm OpenStackVirtualMachine) delete() {
fmt.Println("调用 OpenStack 接口 delete 虚拟机 API")
fmt.Println("... 大量业务逻辑代码 ...")
}
package main
import "fmt"
type VMwareVirtualMachine struct {
vm VirtualMachine
vmwareField string
}
func (vm VMwareVirtualMachine) create() {
fmt.Println("调用 VMware 接口 create 虚拟机 API")
fmt.Println("... 大量业务逻辑代码 ...")
}
func (vm VMwareVirtualMachine) delete() {
fmt.Println("调用 VMware 接口 delete 虚拟机 API")
fmt.Println("... 大量业务逻辑代码 ...")
}
package main
import "fmt"
type AliyunVirtualMachine struct {
vm VirtualMachine
aliyunField string
}
func (vm AliyunVirtualMachine) create() {
fmt.Println("调用 Aliyun 接口 create 虚拟机 API")
fmt.Println("... 大量业务逻辑代码 ...")
}
func (vm AliyunVirtualMachine) delete() {
fmt.Println("调用 Aliyun 接口 delete 虚拟机 API")
fmt.Println("... 大量业务逻辑代码 ...")
}
package main
type VirtualMachineFactory struct {
vmType string
}
func (factory VirtualMachineFactory) create() VirtualMachineInterface {
if factory.vmType == "OpenStack" {
return new(OpenStackVirtualMachine)
} else if factory.vmType == "VMware" {
return new(VMwareVirtualMachine)
} else if factory.vmType == "Aliyun" {
return new(AliyunVirtualMachine)
}
return nil
}
func main() {
factory := new(VirtualMachineFactory)
factory.vmType = "OpenStack"
vm := factory.create()
vm.create()
factory.vmType = "VMware"
vm = factory.create()
vm.create()
factory.vmType = "Aliyun"
vm = factory.create()
vm.create()
}
有些对象属于一类产品,但是属性不同,业务也不同。这种对象可以使用工厂模式来创建。
使用工厂模式的好处是,将对象的创建逻辑从代码主流程中分拆出去,这样主流程代码可读性更高,同时也可以减少逻辑因为同类对象代码耦合在一起引起的逻辑混乱。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。