Abstract Factory(抽象工廠模式)
介紹
當這些小工廠出現一些產品上的不同就需要有把相關方法抽取出來
EX:
香蕉工廠 > 香蕉、香蕉包裝
蘋果工廠 > 蘋果、蘋果包裝
橘子工廠 > 橘子、橘子包裝
水運工廠 > 船、船體大小
陸運工廠 > 車、車體大小
空運工廠 > 飛機、飛機大小
好處
提供了一個抽象對象可創建每種不同的系列,只要透過抽象對象創建,就不會產生不一致的產品
程式範例
Abstract Factory Pattern
創建抽象工廠類
abstract class AbstractFactory {
abstract fun getFruit(): Fruit
abstract fun getBag(): Bag
}
創建水果產品接口
interface Fruit {
fun eat()
}
創建包裝產品接口
interface Bag {
fun pack(fruit: Fruit)
}
實現香蕉產品
class Banana : Fruit {
override fun eat() {
print("吃香蕉\t")
}
}
實現蘋果產品
class Apple : Fruit {
override fun eat() {
print("吃蘋果\t")
}
}
實現橘子產品
class Orange : Fruit {
override fun eat() {
print("吃橘子\t")
}
}
實現香蕉包裝產品
class BananaBag : Bag {
override fun pack(fruit: Fruit) {
println("裝香蕉")
}
}
實現蘋果包裝產品
class AppleBag : Bag {
override fun pack(fruit: Fruit) {
println("裝蘋果")
}
}
實現橘子包裝產品
class OrangeBag : Bag {
override fun pack(fruit: Fruit) {
println("裝橘子")
}
}
實現香蕉工廠(取得香蕉,取得香蕉包裝)
class BananaFactory : AbstractFactory() {
override fun getFruit(): Fruit {
return Banana()
}
override fun getBag(): Bag {
return BananaBag()
}
}
實現蘋果工廠(取得蘋果,取得蘋果包裝)
class AppleFactory : AbstractFactory() {
override fun getFruit(): Fruit {
return Apple()
}
override fun getBag(): Bag {
return AppleBag()
}
}
實現橘子工廠(取得橘子,取得橘子包裝)
class OrangeFactory : AbstractFactory() {
override fun getFruit(): Fruit {
return Orange()
}
override fun getBag(): Bag {
return OrangeBag()
}
}
執行
fun main() {
AbstractFactoryTest().flyGetBanana()
AbstractFactoryTest().flyGetApple()
AbstractFactoryTest().flyGetOrange()
}
class AbstractFactoryTest {
private lateinit var fruitFactory: AbstractFactory
fun flyGetBanana() {
fruitFactory = BananaFactory()
val banana = fruitFactory.getFruit()
banana.eat()
fruitFactory.getBag().pack(banana)
}
fun flyGetApple() {
fruitFactory = AppleFactory()
val apple = fruitFactory.getFruit()
apple.eat()
fruitFactory.getBag().pack(apple)
}
fun flyGetOrange() {
fruitFactory = OrangeFactory()
val orange = fruitFactory.getFruit()
orange.eat()
fruitFactory.getBag().pack(orange)
}
}