Abstract Factory

[Purpose] 

基本上就是factory兩方面進化

1.有很多種factory(例如audi, BMW)

2.一個factory可以生產多種東西, 但是彼此關聯的(例如car, wheel)
   所以factory的public API會有多個
     car* createCar()
     wheel* createWheel()
   但car和wheel是有緊密的, 例如audi專用輪胎, 配audi car
   


好處是 :
1.user不能知道car的全部的member method/variable (因為interface能隱藏實作細節,甚至隱藏類別的存在)
2.user可以用同一種pointer type指向各種car, car再多也不用改code (因為interface能提供多型)
3.factory把車子的創建集中在一個function內, 就不怕外界用錯誤的方法創建car.
4.不同廠牌的車子用不同的xxxFactory創建, (close for modification)
5.你想要創品牌只要建立新的xxxFactory和xxxCar和xxxWhel class就好 (open for extension)
6.建立新的xxxCar並不影響其他car或user內的code (close for modification)

[Implementation]