优化抽象工厂模式示例,添加品牌方法并重构工厂实现,更新构建脚本以支持更清晰的输出
This commit is contained in:
+53
-37
@@ -9,6 +9,7 @@ import "fmt"
|
||||
// 抽象产品:手机
|
||||
type Phone interface {
|
||||
setOS()
|
||||
brand() string
|
||||
}
|
||||
|
||||
// 具体产品:苹果手机
|
||||
@@ -20,6 +21,10 @@ func (p *IPhone) setOS() {
|
||||
fmt.Println(" 为该手机安装IOS系统")
|
||||
}
|
||||
|
||||
func (p *IPhone) brand() string {
|
||||
return p.Brand
|
||||
}
|
||||
|
||||
// 具体产品:小米手机
|
||||
type MiPhone struct {
|
||||
Brand string
|
||||
@@ -29,9 +34,14 @@ func (p *MiPhone) setOS() {
|
||||
fmt.Println(" 为该手机安装安卓系统")
|
||||
}
|
||||
|
||||
func (p *MiPhone) brand() string {
|
||||
return p.Brand
|
||||
}
|
||||
|
||||
// 抽象产品:笔记本电脑
|
||||
type Laptop interface {
|
||||
setOS()
|
||||
brand() string
|
||||
}
|
||||
|
||||
// 具体产品:苹果笔记本电脑
|
||||
@@ -43,6 +53,10 @@ func (l *MacBook) setOS() {
|
||||
fmt.Println(" 为该笔记本安装macOS系统")
|
||||
}
|
||||
|
||||
func (l *MacBook) brand() string {
|
||||
return l.Brand
|
||||
}
|
||||
|
||||
// 具体产品:小米笔记本电脑
|
||||
type MiLaptop struct {
|
||||
Brand string
|
||||
@@ -52,6 +66,10 @@ func (l *MiLaptop) setOS() {
|
||||
fmt.Println(" 为该笔记本安装Windows系统")
|
||||
}
|
||||
|
||||
func (l *MiLaptop) brand() string {
|
||||
return l.Brand
|
||||
}
|
||||
|
||||
// 抽象工厂
|
||||
type Factory interface {
|
||||
CreatePhone() Phone
|
||||
@@ -59,73 +77,71 @@ type Factory interface {
|
||||
}
|
||||
|
||||
// 具体工厂:苹果工厂
|
||||
type AppleFactory struct{}
|
||||
type AppleFactory struct {
|
||||
name string
|
||||
}
|
||||
|
||||
func (f *AppleFactory) CreatePhone() Phone {
|
||||
phone := &IPhone{}
|
||||
phone.Brand = "Apple"
|
||||
phone := &IPhone{Brand: "Apple"}
|
||||
return phone
|
||||
}
|
||||
|
||||
func (f *AppleFactory) CreateLaptop() Laptop {
|
||||
laptop := &MacBook{}
|
||||
laptop.Brand = "Apple"
|
||||
laptop := &MacBook{Brand: "Apple"}
|
||||
return laptop
|
||||
}
|
||||
|
||||
func newAppleFactory() Factory {
|
||||
return &AppleFactory{name: "苹果工厂"}
|
||||
}
|
||||
|
||||
// 具体工厂:小米工厂
|
||||
type MiFactory struct{}
|
||||
type MiFactory struct {
|
||||
name string
|
||||
}
|
||||
|
||||
func (f *MiFactory) CreatePhone() Phone {
|
||||
phone := &MiPhone{}
|
||||
phone.Brand = "Xiaomi"
|
||||
phone := &MiPhone{Brand: "Xiaomi"}
|
||||
return phone
|
||||
}
|
||||
|
||||
func (f *MiFactory) CreateLaptop() Laptop {
|
||||
laptop := &MiLaptop{}
|
||||
laptop.Brand = "Xiaomi"
|
||||
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
|
||||
var phone Phone
|
||||
var laptop Laptop
|
||||
|
||||
fmt.Println("======== 抽象工厂模式 ========")
|
||||
|
||||
// 选择苹果工厂
|
||||
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()
|
||||
}
|
||||
factory = newAppleFactory()
|
||||
fmt.Printf("伟哥选择了%s生产产品:\n", factory.(*AppleFactory).name)
|
||||
client(factory)
|
||||
|
||||
fmt.Println()
|
||||
fmt.Println("切换工厂生产其他品牌的产品...")
|
||||
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()
|
||||
}
|
||||
|
||||
factory = newMiFactory()
|
||||
fmt.Printf("伟哥选择了%s生产产品:\n", factory.(*MiFactory).name)
|
||||
client(factory)
|
||||
fmt.Println("====== 抽象工厂模式结束 ======")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user