Golang工厂模式

146 阅读1分钟

相关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")
}