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 }

 

posted @ 2023-04-20 18:06  格局打得开  阅读(48)  评论(0)    收藏  举报