1
0
Fork 0

实现抽象工厂模式,添加手机和笔记本电脑的具体产品及工厂

This commit is contained in:
IvisTang 2025-12-09 00:43:40 +08:00
parent 76e8275edd
commit 7498a885fc
1 changed files with 124 additions and 0 deletions

View File

@ -1 +1,125 @@
package main package main
import "fmt"
/* 实例
今天伟哥约自己在富士康工作的老乡出来喝酒没想到老乡最近一直在加班听说接了个大活要同时为小米公司和苹果公司代工他们的笔记本电脑和手机生产业务
*/
// 抽象产品:手机
type Phone interface {
setOS()
}
// 具体产品:苹果手机
type IPhone struct {
Brand string
}
func (p *IPhone) setOS() {
fmt.Println("为该手机安装IOS系统")
}
// 具体产品:小米手机
type MiPhone struct {
Brand string
}
func (p *MiPhone) setOS() {
fmt.Println("为该手机安装安卓系统")
}
// 抽象产品:笔记本电脑
type Laptop interface {
setOS()
}
// 具体产品:苹果笔记本电脑
type MacBook struct {
Brand string
}
func (l *MacBook) setOS() {
fmt.Println("为该笔记本安装macOS系统")
}
// 具体产品:小米笔记本电脑
type MiLaptop struct {
Brand string
}
func (l *MiLaptop) setOS() {
fmt.Println("为该笔记本安装Windows系统")
}
// 抽象工厂
type Factory interface {
CreatePhone() Phone
CreateLaptop() Laptop
}
// 具体工厂:苹果工厂
type AppleFactory struct{}
func (f *AppleFactory) CreatePhone() Phone {
phone := &IPhone{}
phone.Brand = "Apple"
return phone
}
func (f *AppleFactory) CreateLaptop() Laptop {
laptop := &MacBook{}
laptop.Brand = "Apple"
return laptop
}
// 具体工厂:小米工厂
type MiFactory struct{}
func (f *MiFactory) CreatePhone() Phone {
phone := &MiPhone{}
phone.Brand = "Xiaomi"
return phone
}
func (f *MiFactory) CreateLaptop() Laptop {
laptop := &MiLaptop{}
laptop.Brand = "Xiaomi"
return laptop
}
func main() {
var factory Factory
var phone Phone
var laptop Laptop
// 选择苹果工厂
fmt.Println("伟哥选择了苹果工厂生产产品:")
factory = &AppleFactory{}
phone = factory.CreatePhone()
laptop = factory.CreateLaptop()
if iphone, ok := phone.(*IPhone); ok {
fmt.Printf("生产了一台%s手机\n", iphone.Brand)
iphone.setOS()
}
if macbook, ok := laptop.(*MacBook); ok {
fmt.Printf("生产了一台%s笔记本电脑\n", macbook.Brand)
macbook.setOS()
}
fmt.Println()
// 选择小米工厂
fmt.Println("伟哥选择了小米工厂生产产品:")
factory = &MiFactory{}
phone = factory.CreatePhone()
laptop = factory.CreateLaptop()
if miPhone, ok := phone.(*MiPhone); ok {
fmt.Printf("生产了一台%s手机\n", miPhone.Brand)
miPhone.setOS()
}
if miLaptop, ok := laptop.(*MiLaptop); ok {
fmt.Printf("生产了一台%s笔记本电脑\n", miLaptop.Brand)
miLaptop.setOS()
}
}