Help us understand the problem. What is going on with this article?

【Gang of Four】デザインパターン学習 - Prototype

Prototype - 試作品

目次
部品をプールし、クローンすることでオブジェクトを生成するパターンです。

目的

生成すべきオブジェクトの種類を原型となるインスタンスを使って明確にし、それをコピーすることで新たなオブジェクトの生成を行う。

構成要素

・Prototype 複製を行う抽象クラス
・ConcretePrototype 複製を行う具象クラス
・Client 複製を依頼するクラス

実装

車を量産するために必要な試作品工場を実装します。

まずは試作品工場が作る部品から実装します。

エンジンクラス

Engine.kt
package prototype

class Engine(displacement: Int): Cloneable {
    var displacement = displacement

    fun show() {
        print("【エンジン】"+ displacement +"cc ")
    }

    public override fun clone(): Any {
        return super.clone()
    }
}

タイヤクラス

Tire.kt
package prototype

class Tire(num: Int): Cloneable {
    var num = num

    fun show() {
        print("【タイヤ】" + num + "個 ")
    }

    public override fun clone(): Any {
        return super.clone()
    }
}

以上が部品です。続いて製品の車を実装します。

車クラス

Car.kt
package prototype

class Car(engine: Engine, tire: Tire) {
    val engine = engine
    val tire = tire

    fun show() {
        print("【製品】車 ")
        engine.show()
        tire.show()
        print("\n")
    }
}

今まで実装したEngineとTireを次々量産できる工場を実装します。

Prototype 複製を行う抽象クラス

試作品インターフェース

ProtoType.kt
package prototype

/**
 * 試作品
 * Prototype
 */
interface ProtoType {
    fun createEngine(): Engine
    fun createTire(): Tire
}

ConcretePrototype 複製を行う具象クラス

試作品工場クラス

ProtoTypeFactory.kt
package prototype

class ProtoTypeFactory: ProtoType {
    var engine = Engine(0)
    var tire = Tire(4)

    override fun createEngine(): Engine {
        return engine.clone() as Engine
    }

    override fun createTire(): Tire {
        return tire.clone() as Tire
    }
}

最後に試作品工場から部品を受け取り製品を量産する工場を実装します。

Client 複製を依頼するクラス

車製造工場クラス

Factory.kt
package prototype

class Factory {
    var carList:MutableList<Car> = mutableListOf()
    var prototypeFactory = ProtoTypeFactory()
    init {

        // 排気量を1000ccに設定
        prototypeFactory.engine.displacement = 1000
        // 排気量1000ccの車を3台量産する
        massProduction(3)

        // 排気量を2000ccに設定
        prototypeFactory.engine.displacement = 2000
        // 排気量2000ccの車を2台量産する
        massProduction(2)

        // 排気量を12000ccに設定
        prototypeFactory.engine.displacement = 12000
        // タイヤを8本に設定
        prototypeFactory.tire.num = 8
        // 排気量12000cc タイヤ8本の車を5台量産する バス?
        massProduction(5)

        for (car in carList) {
            car.show()
        }
    }

    private fun massProduction(num: Int) {
        for (i in 0..num) {
            carList.add(Car(prototypeFactory.createEngine(), prototypeFactory.createTire()))
        }
    }
}

以上で試作品を次々量産できる工場が実装できました。Abstract Factoryパターンとは異なり、いろいろな車種を量産したくなってもProtoTypeFactoryクラスが持つ部品のメンバを変更すれば新たな工場を実装せずに済みます。

出力結果

[output]
【製品】車 【エンジン】1000cc 【タイヤ】4個 
【製品】車 【エンジン】1000cc 【タイヤ】4個 
【製品】車 【エンジン】1000cc 【タイヤ】4個 
【製品】車 【エンジン】1000cc 【タイヤ】4個 
【製品】車 【エンジン】2000cc 【タイヤ】4個 
【製品】車 【エンジン】2000cc 【タイヤ】4個 
【製品】車 【エンジン】2000cc 【タイヤ】4個 
【製品】車 【エンジン】12000cc 【タイヤ】8個 
【製品】車 【エンジン】12000cc 【タイヤ】8個 
【製品】車 【エンジン】12000cc 【タイヤ】8個 
【製品】車 【エンジン】12000cc 【タイヤ】8個 
【製品】車 【エンジン】12000cc 【タイヤ】8個 
【製品】車 【エンジン】12000cc 【タイヤ】8個 
takumi0620
今はAndroidの仕事がメイン https://github.com/takumi0620
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした