相关repo: gitee.com/gaaidou/gaa…
Golang使用interface的时候,没有直接使用继承关系。在Java里面,如果类implements一个接口,那么必须重新interface的方法。
在Golang里面,是在类被调用的时候才进行类型检查
factory.go
package designpattern
const (
Traffic_Train = "Train"
Traffic_Trip = "Trip"
Traffic_Plane = "Plane"
Traffic_Unknow = "Unknow"
)
type Traffic interface {
Travel() string
}
type Train struct {
}
func (t Train) Travel() string {
println("Travel by train")
return Traffic_Train
}
type Trip struct {
}
func (trip Trip) Travel() string {
println("Travel by trip")
return Traffic_Trip
}
type Plane struct {
}
func (p Plane) Travel() string {
println("Travel by plane")
return Traffic_Plane
}
type Unknow struct {
}
func (u Unknow) Travel() string {
println("Unknow traffic tool")
return Traffic_Unknow
}
func NewTraffic(trafficType string) Traffic {
switch trafficType {
case Traffic_Train:
return &Train{}
case Traffic_Trip:
return &Trip{}
case Traffic_Plane:
return &Plane{}
default:
return &Unknow{}
}
}
factory_test.go
package design_pattern
import (
"ptarmigan-golang-design-pattern/src/designpattern"
"testing"
)
func TestFactory(t *testing.T) {
plane := designpattern.NewTraffic(designpattern.Traffic_Plane)
if plane.Travel() != designpattern.Traffic_Plane {
t.Error("Failed to create Plane object")
}
train := designpattern.NewTraffic(designpattern.Traffic_Train)
if train.Travel() != designpattern.Traffic_Train {
t.Error("Failed to create Train object")
}
trip := designpattern.NewTraffic(designpattern.Traffic_Trip)
if trip.Travel() != designpattern.Traffic_Trip {
t.Error("Failed to create Trip object")
}
unknow := designpattern.NewTraffic("Unknow")
if unknow.Travel() != designpattern.Traffic_Unknow {
t.Error("Failed to create Unknow object")
}
println("Successfully created object using factory pattern")
}