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