『増補改訂版Java言語で学ぶデザインパターン入門』をKotlinでやってみる(Factory Method編)


【経緯】

『増補改訂版Java言語で学ぶデザインパターン入門』をKotlinでやってみるの第四回目。
今回はFactory Methodパターンです。

【コード】

Factory MethodパターンはTemplate Methodパターンのインスタンス生成の場面に適用したもの、らしいです。
Template Methodパターンの発展形?亜種?みたいなイメージでしょうか。
結局やりたいのはスーパークラスでインスタンスの生成の仕方を決めてしまって、具体的な処理はサブクラスで行う物です。
今回は問題がサンプルの発展形なので、まとめます。

Factory.kt
abstract class Factory {
    final fun create(owner:String) : Product {

        var p:Product = createProduct(owner)
        registerProduct(p)
        return p
    }

    protected abstract fun createProduct(owner: String) : Product
    protected abstract fun registerProduct(product: Product)
}
Product.kt
abstract class Product {
    abstract fun use()
}
IDCard.kt
class IDCard(owner: String, number:Int) : Product() {
    private var own:String = owner
    private var num:Int = number

    init {
        Log.d("IDCard", own + "(" + num + ")" + "のカードを作ります。")
    }

    override fun use() {
        Log.d("IDCard", own + "(" + num + ")" + "のカードを使います。")
    }

    fun getOwner():String {
        return own
    }

    fun getNumber():Int {
        return num
    }
}
IDCardFactory.kt
class IDCardFactory : Factory() {
    private var owners = HashMap<Int, String>();
    private var num:Int = 0

    protected override fun createProduct(owner: String): Product {
        num++
        return IDCard(owner, num)
    }

    override fun registerProduct(product: Product) {
        product as IDCard
        owners.put(product.getNumber(), product.getOwner())
    }

    fun getOwner():HashMap<Int, String> {
        return  owners
    }

}
MainActivity.kt
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var factory:Factory = IDCardFactory()
        var card1:Product = factory.create("とむら")
        var card2:Product = factory.create("結城浩")
        var card3:Product = factory.create("佐藤花子")

        card1.use()
        card2.use()
        card3.use()
    }
出力結果
とむら(1)のカードを作ります。
結城浩(2)のカードを作ります。
佐藤花子(3)のカードを作ります。
とむら(1)のカードを使います。
結城浩(2)のカードを使います。
佐藤花子(3)のカードを使います。

第四回までやってきて思いましたがこれ通常業務の実装の中で活かせる気がしないぞ。