GoLang设计模式03 - 工厂方法模式

我们知道,开闭原则指的是对修改关闭,对扩展开放,而工厂方法就是为了解决这个问题,它提供一个工厂抽象接口,每一种产品的生产都会有自己的工厂,消费者从对应工厂获取产品即可,如果增加了一种产品,只需要增加对应的工厂即可,从而避免了修改,只是扩展。但是也会出现一个问题,那就是会出现大量的工厂类,代码量大。

 

 1 package factorymethod
 2 
 3 import "fmt"
 4 
 5 //抽象层
 6 type Fruit interface {
 7     show()
 8 }
 9 type Factory interface {
10     create() Fruit
11 }
12 
13 //实现层
14 type Apple struct {
15     Fruit //方便理解为继承,可省略
16 }
17 
18 func (a *Apple) show() {
19     fmt.Println("i am Apple")
20 }
21 
22 type Banana struct {
23     Fruit //方便理解为继承,可省略
24 }
25 
26 func (a *Banana) show() {
27     fmt.Println("i am Banana")
28 }
29 
30 type Pear struct {
31     Fruit //方便理解为继承,可省略
32 }
33 
34 func (a *Pear) show() {
35     fmt.Println("i am Pear")
36 }
37 
38 type AppleFactory struct {
39     Factory
40 }
41 
42 func (a *AppleFactory) create() Fruit {
43     var fruit Fruit
44     fruit = new(Apple)
45     return fruit
46 }
47 
48 type BananaFactory struct {
49     Factory
50 }
51 
52 func (a *BananaFactory) create() Fruit {
53     var fruit Fruit
54     fruit = new(Banana)
55     return fruit
56 }
57 
58 type PearFactory struct {
59     Factory
60 }
61 
62 func (a *PearFactory) create() Fruit {
63     var fruit Fruit
64     fruit = new(Pear)
65     return fruit
66 }
67 
68 //业务层
69 func main() {
70     var appleFac Factory
71     appleFac = new(AppleFactory)
72     var apple Fruit
73     apple = appleFac.create()
74     apple.show()
75 
76     var pearFac Factory
77     pearFac = new(PearFactory)
78     pear := pearFac.create()
79     pear.show()
80 
81     var bananaFac Factory
82     bananaFac = new(BananaFactory)
83     banana := bananaFac.create()
84     banana.show()
85 }

 

优点

  1. 你可以避免创建者和具体产品之间的紧密耦合。
  2. 单一职责原则。 你可以将产品创建代码放在程序的单一位置, 从而使得代码更容易维护。
  3. 开闭原则。 无需更改现有客户端代码, 你就可以在程序中引入新的产品类型。

缺点

  1. 在添加新的产品的时候,会导致系统类的增加,从而增加了系统的复杂性和理解难度。
  2. 为了系统的可扩展型,引入了抽象层,增加了系统的抽象性,和理解难度。
posted @ 2023-04-20 17:58  格局打得开  阅读(59)  评论(0)    收藏  举报