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 }
优点
- 你可以避免创建者和具体产品之间的紧密耦合。
- 单一职责原则。 你可以将产品创建代码放在程序的单一位置, 从而使得代码更容易维护。
- 开闭原则。 无需更改现有客户端代码, 你就可以在程序中引入新的产品类型。
缺点
- 在添加新的产品的时候,会导致系统类的增加,从而增加了系统的复杂性和理解难度。
- 为了系统的可扩展型,引入了抽象层,增加了系统的抽象性,和理解难度。
浙公网安备 33010602011771号