Design Pattern

創建型模式-Abstract Factory(抽象工廠模式)

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)
    }
}

發表迴響