GoLang设计模式04 - 抽象工厂模式@
我们已经知道,工厂方法模式只能生产单一产品,如果新增同一等级的产品,那么可以增加对应产品的工厂,既如现在有这样一个需求,我们需要手机和电脑两种产品,这两种产品可以看作是形成了一个产品族,我们需要一个工厂能够同时生产手机和电脑,显然工厂方法做不到这样,而抽象工厂就可以,抽象工厂具有一个可以生产产品族的接口,然后有不同的工厂去实现,相当于是一个可以生产工厂的工厂。
1 package abstractfactory 2 3 import "fmt" 4 5 // 抽象层 6 type AbstractApple interface { 7 showApple() 8 } 9 type AbstractBanana interface { 10 showBanana() 11 } 12 type AbstractPear interface { 13 showPear() 14 } 15 16 // 抽象层 抽象工厂 17 type AbstractFactory interface { 18 createApple() AbstractApple 19 createBanana() AbstractBanana 20 createPear() AbstractPear 21 } 22 23 //实现层 24 /*中国产品族*/ 25 type chinaApple struct{} 26 27 func (c *chinaApple) showApple() { 28 fmt.Println("i am china Apple") 29 } 30 31 type chinaBanana struct{} 32 33 func (c *chinaBanana) showBanana() { 34 fmt.Println("i am china Banana") 35 } 36 37 type chinaPear struct{} 38 39 func (c *chinaPear) showPear() { 40 fmt.Println("i am china Pear") 41 } 42 43 type chinaFactory struct{} 44 45 func (cf *chinaFactory) createApple() AbstractApple { 46 var apple AbstractApple 47 apple = new(chinaApple) 48 return apple 49 } 50 func (cf *chinaFactory) createBanana() AbstractBanana { 51 var banana AbstractBanana 52 banana = new(chinaBanana) 53 return banana 54 } 55 func (cf *chinaFactory) createPear() AbstractPear { 56 var pear AbstractPear 57 pear = new(chinaPear) 58 return pear 59 } 60 61 /*日本产品族*/ 62 type japanApple struct{} 63 64 func (j *japanApple) showApple() { 65 fmt.Println("i am japan Apple") 66 } 67 68 type japanBanana struct{} 69 70 func (j *japanBanana) showBanana() { 71 fmt.Println("i am japan Banana") 72 } 73 74 type japanPear struct{} 75 76 func (j *japanPear) showPear() { 77 fmt.Println("i am japan Pear") 78 } 79 80 // 业务层 81 func main() { 82 //1 需求:需要中国的苹果香蕉苹果梨 83 //创建中国工厂 84 var fac AbstractFactory 85 fac = new(chinaFactory) 86 //生产一个苹果 87 var apple AbstractApple 88 apple = fac.createApple() 89 apple.showApple() 90 //生产一个香蕉 91 var banana AbstractBanana 92 banana = fac.createBanana() 93 banana.showBanana() 94 //生产一个梨 95 var pear AbstractPear 96 pear = fac.createPear() 97 pear.showPear() 98 }
浙公网安备 33010602011771号