什么是抽象工厂?
抽象工厂模式是在简单工厂的基础上将未来可能需要修改的代码抽象出来,通过继承的方式让子类去做决定。
实现
type HightTea interface {
Cook()
}
type CoffeeMaker struct {
Name string
}
func (this CoffeeMaker) Cook() {
fmt.Printf("这里做%s咖啡!!!\n", this.Name)
}
type CakeMaker struct {
Name string
}
func (this CakeMaker) Cook() {
fmt.Printf("这里做%s蛋糕!!!\n", this.Name)
}
type HightTeaFactory interface {
CreateCoffeeMaker(name string) HightTea
CreateCakeMaker(name string) HightTea
}
type SimpleHightTeaFactory struct {
Name string
}
func NewSimpleHightTeaFactory(name string) HightTeaFactory {
return &SimpleHightTeaFactory{Name: name}
}
func (this SimpleHightTeaFactory) CreateCoffeeMaker(name string) HightTea {
return &CoffeeMaker{Name:name}
}
func (this SimpleHightTeaFactory) CreateCakeMaker(name string) HightTea {
return &CakeMaker{Name:name}
}
func TestNewSimpleHightTeaFactory(t *testing.T) {
hightTeaFactory := NewSimpleHightTeaFactory("SimpleHightTeaFactory")
coffeeMaker := hightTeaFactory.CreateCoffeeMaker("Latte")
coffeeMaker.Cook()
cakeMaker := hightTeaFactory.CreateCakeMaker("Qifeng")
cakeMaker.Cook()
}
// === RUN TestNewSimpleHightTeaFactory
// 这里做Latte咖啡!!!
// 这里做Qifeng蛋糕!!!
// --- PASS: TestNewSimpleHightTeaFactory (0.00s)
// PASS
优点:
- 体产品在应用层代码隔离,无须关心创建细节
- 将一系列的产品族统一到一起创建
缺点:
- 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口;
- 增加了系统的抽象性和理解难度。
网友评论