更新生成者模式示例,添加木屋和砖房建造者实现,重构相关代码并增强可读性
This commit is contained in:
+1
-1
@@ -1,4 +1,4 @@
|
||||
BUILDDIR := build
|
||||
BUILDDIR := bin
|
||||
DIRS := $(shell ls -d */)
|
||||
|
||||
ifndef VERBOSE
|
||||
|
||||
@@ -3,7 +3,7 @@ package main
|
||||
import "fmt"
|
||||
|
||||
/* 实例
|
||||
今天伟哥约自己在富士康工作的老乡出来喝酒,没想到老乡最近一直在加班。听说接了个大活,要同时为小米公司和苹果公司代工他们的笔记本电脑和手机生产业务。
|
||||
今天汤宝宝约自己在富士康工作的老乡出来喝酒,没想到老乡最近一直在加班。听说接了个大活,要同时为小米公司和苹果公司代工他们的笔记本电脑和手机生产业务。
|
||||
*/
|
||||
|
||||
// 抽象产品:手机
|
||||
@@ -114,6 +114,7 @@ func newMiFactory() Factory {
|
||||
return &MiFactory{name: "小米工厂"}
|
||||
}
|
||||
|
||||
// 客户端代码
|
||||
func client(factory Factory) {
|
||||
phone := factory.CreatePhone()
|
||||
laptop := factory.CreateLaptop()
|
||||
@@ -132,7 +133,7 @@ func main() {
|
||||
|
||||
// 选择苹果工厂
|
||||
factory = newAppleFactory()
|
||||
fmt.Printf("伟哥选择了%s生产产品:\n", factory.(*AppleFactory).name)
|
||||
fmt.Printf("汤宝宝选择了%s生产产品:\n", factory.(*AppleFactory).name)
|
||||
client(factory)
|
||||
|
||||
fmt.Println()
|
||||
@@ -141,7 +142,7 @@ func main() {
|
||||
|
||||
// 选择小米工厂
|
||||
factory = newMiFactory()
|
||||
fmt.Printf("伟哥选择了%s生产产品:\n", factory.(*MiFactory).name)
|
||||
fmt.Printf("汤宝宝选择了%s生产产品:\n", factory.(*MiFactory).name)
|
||||
client(factory)
|
||||
fmt.Println("====== 抽象工厂模式结束 ======")
|
||||
fmt.Println("\n====== 抽象工厂模式结束 ======")
|
||||
}
|
||||
|
||||
@@ -0,0 +1,120 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
/* 实例
|
||||
汤宝宝想要建造一栋属于自己的房子,于是找来了著名的建筑设计
|
||||
公司——生成者模式公司(Builder Pattern Inc.)帮忙设计和建造房子。
|
||||
*/
|
||||
|
||||
// 产品:房子
|
||||
type House struct {
|
||||
Foundation string // 地基
|
||||
Structure string // 结构
|
||||
Roof string // 屋顶
|
||||
}
|
||||
|
||||
// 建造者接口
|
||||
type HouseBuilder interface {
|
||||
buildFoundation()
|
||||
buildStructure()
|
||||
buildRoof()
|
||||
getHouse() House
|
||||
}
|
||||
|
||||
// 具体建造者:木屋建造者
|
||||
type WoodenHouseBuilder struct {
|
||||
house House
|
||||
}
|
||||
|
||||
func (b *WoodenHouseBuilder) buildFoundation() {
|
||||
b.house.Foundation = "木桩地基"
|
||||
fmt.Println(" 建造木桩地基")
|
||||
}
|
||||
|
||||
func (b *WoodenHouseBuilder) buildStructure() {
|
||||
b.house.Structure = "木结构"
|
||||
fmt.Println(" 建造木结构")
|
||||
}
|
||||
|
||||
func (b *WoodenHouseBuilder) buildRoof() {
|
||||
b.house.Roof = "木屋顶"
|
||||
fmt.Println(" 建造木屋顶")
|
||||
}
|
||||
|
||||
func (b *WoodenHouseBuilder) getHouse() House {
|
||||
return b.house
|
||||
}
|
||||
|
||||
// 具体建造者:砖房建造者
|
||||
type BrickHouseBuilder struct {
|
||||
house House
|
||||
}
|
||||
|
||||
func (b *BrickHouseBuilder) buildFoundation() {
|
||||
b.house.Foundation = "混凝土地基"
|
||||
fmt.Println(" 建造混凝土地基")
|
||||
}
|
||||
|
||||
func (b *BrickHouseBuilder) buildStructure() {
|
||||
b.house.Structure = "砖结构"
|
||||
fmt.Println(" 建造砖结构")
|
||||
}
|
||||
|
||||
func (b *BrickHouseBuilder) buildRoof() {
|
||||
b.house.Roof = "瓦屋顶"
|
||||
fmt.Println(" 建造瓦屋顶")
|
||||
}
|
||||
|
||||
func (b *BrickHouseBuilder) getHouse() House {
|
||||
return b.house
|
||||
}
|
||||
|
||||
// 指挥者
|
||||
type Director struct {
|
||||
builder HouseBuilder
|
||||
house House
|
||||
}
|
||||
|
||||
// 重置房子
|
||||
func (d *Director) reset() {
|
||||
d.house = House{}
|
||||
}
|
||||
|
||||
func (d *Director) setBuilder(b HouseBuilder) {
|
||||
d.builder = b
|
||||
}
|
||||
|
||||
func (d *Director) constructHouse() {
|
||||
d.reset()
|
||||
d.builder.buildFoundation()
|
||||
d.builder.buildStructure()
|
||||
d.builder.buildRoof()
|
||||
d.house = d.builder.getHouse()
|
||||
}
|
||||
|
||||
func main() {
|
||||
var builder HouseBuilder
|
||||
var director Director
|
||||
var house House
|
||||
|
||||
fmt.Println("========= 生成者模式 =========")
|
||||
// 使用木屋建造者
|
||||
builder = &WoodenHouseBuilder{}
|
||||
director.setBuilder(builder)
|
||||
fmt.Println("建造木屋:")
|
||||
director.constructHouse()
|
||||
house = director.house
|
||||
fmt.Printf("木屋建造完成:%s %s %s\n\n", house.Foundation, house.Structure, house.Roof)
|
||||
|
||||
// 使用砖房建造者
|
||||
builder = &BrickHouseBuilder{}
|
||||
director.setBuilder(builder)
|
||||
fmt.Println("建造砖房:")
|
||||
director.constructHouse()
|
||||
house = director.house
|
||||
fmt.Printf("砖房建造完成:%s %s %s\n\n", house.Foundation, house.Structure, house.Roof)
|
||||
|
||||
fmt.Println("======= 生成者模式结束 =======")
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user