工厂模式是一种创建型设计模式,主要用于创建对象而不直接指定具体的类。它将对象的创建过程封装在一个工厂类中,这样可以在不修改客户端代码的情况下,改变创建的对象类型或实现。简单来说,工厂模式就像是一个“工厂”,根据需求生产不同的“产品”。
出行模式可以用工厂模式 比如坐飞机 坐高铁 做大巴去北京玩
假设我们要实现一个程序来选择不同的出行方式:
1. 定义出行工具接口:表示所有出行工具的共同行为。
2. 具体出行工具类:实现出行工具接口,比如飞机、高铁和大巴。
3. 工厂类:根据客户的需求创建具体的出行工具实例。
package main
import (
"fmt"
"time"
)
// 出行工具接口
type TravelMode interface {
Travel() string
Price() float64
ArrivalTime() time.Time
}
// 具体出行工具:飞机
type Airplane struct {
price float64
arrivalTime time.Time
}
func (a Airplane) Travel() string {
return "Flying by airplane"
}
func (a Airplane) Price() float64 {
return a.price
}
func (a Airplane) ArrivalTime() time.Time {
return a.arrivalTime
}
// 具体出行工具:高铁
type HighSpeedTrain struct {
price float64
arrivalTime time.Time
}
func (h HighSpeedTrain) Travel() string {
return "Traveling by high-speed train"
}
func (h HighSpeedTrain) Price() float64 {
return h.price
}
func (h HighSpeedTrain) ArrivalTime() time.Time {
return h.arrivalTime
}
// 具体出行工具:大巴
type Bus struct {
price float64
arrivalTime time.Time
}
func (b Bus) Travel() string {
return "Traveling by bus"
}
func (b Bus) Price() float64 {
return b.price
}
func (b Bus) ArrivalTime() time.Time {
return b.arrivalTime
}
// 工厂类
func TravelModeFactory(modeType string, price float64, arrivalTime time.Time) TravelMode {
if modeType == "airplane" {
return Airplane{price: price, arrivalTime: arrivalTime}
} else if modeType == "train" {
return HighSpeedTrain{price: price, arrivalTime: arrivalTime}
} else if modeType == "bus" {
return Bus{price: price, arrivalTime: arrivalTime}
}
return nil
}
func main() {
// 创建不同的出行工具
now := time.Now()
airplane := TravelModeFactory("airplane", 500.0, now.Add(2*time.Hour))
train := TravelModeFactory("train", 150.0, now.Add(1*time.Hour))
bus := TravelModeFactory("bus", 50.0, now.Add(5*time.Hour))
// 输出信息
fmt.Printf("%s\nPrice: $%.2f\nArrival Time: %v\n", airplane.Travel(), airplane.Price(), airplane.ArrivalTime())
fmt.Printf("%s\nPrice: $%.2f\nArrival Time: %v\n", train.Travel(), train.Price(), train.ArrivalTime())
fmt.Printf("%s\nPrice: $%.2f\nArrival Time: %v\n", bus.Travel(), bus.Price(), bus.ArrivalTime())
}
工厂方法 TravelModeFactory 用于创建具体的出行工具实例。
• 根据传入的 modeType 参数(“airplane”、“train” 或 “bus”),工厂方法返回相应的具体出行工具实例,并传入价格和到达时间。
• 如果 modeType 不匹配任何已知的类型,工厂方法返回 nil。