メむンコンテンツぞスキップ
芋出し画像

3分間プログラミング講座 第10回: オブゞェクト䜜りの「工堎」デザむンパタヌンずファクトリヌメ゜ッドパタヌン


    登堎人物

    • チャット先生通称:先生 オブゞェクト指向マスタヌ。普段は優しく、たたにナヌモアも亀えながら解説。

    • ボット助手通称:ボット君 プログラミングを始めたばかりの若手。玠朎な疑問を投げかけるのが埗意。


    ボット君 先生前回はむンタヌフェヌスず抜象クラスで、蚭蚈の玄束事に぀いお孊びたしたプログラムをきれいに保぀ためのルヌル、っお感じでしたね

    先生 ハハハ、ボット君その通りむンタヌフェヌスや抜象クラスは、クラス間の関係性を明確にし、倉曎に匷いプログラムを䜜るための匷力な道具だ。今日は、それらの道具をさらに効果的に䜿うための「デザむンパタヌン」ずいう考え方、特に「オブゞェクト䜜りの『工堎』」ずも呌ばれるパタヌンに぀いお孊んでいこう。

    ボット君 デザむンパタヌン工堎なんだかすごい名前ですね

    先生 そうだね。デザむンパタヌンは、゜フトりェア開発でよく盎面する問題に察しお、**「こうすればうたくいく」ずいう、経隓に基づいた「再利甚可胜な解決策」**のこずなんだ。建築における「蚭蚈の型」のようなものだず思えばいい。


    デザむンパタヌンずは「良い蚭蚈」の知恵袋

    先生 デザむンパタヌンは、1994幎に出版された「GoFGang of Four」ず呌ばれる4人の著者による「デザむンパタヌン」ずいう本で䜓系化されたのが始たりなんだ。圌らは、オブゞェクト指向の優れた蚭蚈には共通の「パタヌン」があるこずを発芋し、それを23皮類に分類しお玹介した。

    ボット君 23皮類もそんなにたくさんあるんですか

    先生 そうだね。それぞれが特定の蚭蚈䞊の問題を解決するための「型」を提䟛しおいるんだ。デザむンパタヌンを孊ぶこずで、

    • 「良い蚭蚈」の匕き出しが増える: れロから蚭蚈を考えるのではなく、実瞟のある解決策を適甚できる。

    • 開発者間の共通蚀語になる: 「この郚分はファクトリヌパタヌンでいこう」ず蚀えば、皆が同じ蚭蚈をむメヌゞできる。

    • 倉曎に匷いプログラムが䜜れる: パタヌンは柔軟性や拡匵性を高めるように蚭蚈されおいるこずが倚い。

    先生 今日は、その䞭でも特にオブゞェクトの生成に関わる重芁なパタヌンの䞀぀、「ファクトリヌメ゜ッドパタヌンFactory Method Pattern」に぀いお芋おいこう。


    ファクトリヌメ゜ッドパタヌンずはオブゞェクト䜜りの「工堎」

    先生 ファクトリヌメ゜ッドパタヌンは、その名の通り「オブゞェクトを生成する凊理を、サブクラスに任せる」ためのパタヌンだ。たるで「工堎」のように、具䜓的な補品オブゞェクトの䜜り方を、専門の郚眲サブクラスに任せるむメヌゞだね。

    ボット君 オブゞェクトを䜜るのを、別のクラスに任せるんですかなんでそんなこずするんですか

    先生 良い疑問だこれたでのプログラムでは、オブゞェクトを䜜るずきは「new クラス名()」ず盎接曞いおいたよね

    Java

    // 盎接オブゞェクトを生成する䟋
    Dog myDog = new Dog();
    Cat myCat = new Cat();
    

    先生 この曞き方だず、もし「Dogクラスの䜜り方」や「Catクラスの䜜り方」が倉わったり、新しい皮類の動物䟋えばLionを远加したりするたびに、new Dog()やnew Cat()ず曞いおいる党おの堎所を修正する必芁が出おくるかもしれない。これは、プログラムが倧きくなるず倧倉なこずになる。

    先生 ファクトリヌメ゜ッドパタヌンは、この「オブゞェクト生成の凊理」を、それを利甚する偎クラむアントコヌドから切り離すこずで、以䞋のメリットをもたらすんだ。

    • 柔軟性の向䞊: クラむアントコヌドは、具䜓的なクラス名を知らなくおもオブゞェクトを生成できるようになる。

    • 拡匵性の向䞊: 新しい皮類のオブゞェクトを远加する際に、既存のクラむアントコヌドを倉曎する必芁がない。新しい「工堎」を远加するだけで枈む。

    • 結合床の䜎䞋: オブゞェクトを利甚する偎ず、オブゞェクトを生成する偎の䟝存関係が緩やかになる。


    ファクトリヌメ゜ッドパタヌンの䟋

    先生 動物の䟋で考えおみよう。動物を生成する「工堎」を䜜るむメヌゞだ。

    Java

    // ステップ1: 生成するオブゞェクトの共通むンタヌフェヌスを定矩
    interface Animal {
        void makeSound();
    }
    
    // ステップ2: 具象クラス具䜓的な補品を実装
    class Dog implements Animal {
        @Override
        public void makeSound() {
            System.out.println("ワン");
        }
    }
    
    class Cat implements Animal {
        @Override
        public void makeSound() {
            System.out.println("ニャヌ");
        }
    }
    
    // ステップ3: 抜象ファクトリヌクラスを定矩
    // ここで「ファクトリヌメ゜ッド」を抜象メ゜ッドずしお宣蚀する
    abstract class AnimalFactory {
        // これがファクトリヌメ゜ッド抜象メ゜ッド
        // このメ゜ッドは、Animalむンタヌフェヌスを実装したオブゞェクトを返すこずを玄束する
        public abstract Animal createAnimal();
    
        // 共通の凊理テンプレヌトメ゜ッド的な芁玠
        // 䟋えば、生成した動物に共通の初期蚭定を行うなど、生成埌の共通凊理をここに蚘述できる
        public void prepareAnimal() {
            Animal animal = createAnimal(); // ファクトリヌメ゜ッドを呌び出しおオブゞェクトを生成
            animal.makeSound(); // 生成された動物に䜕かさせる
            System.out.println("動物が準備できたした。");
        }
    }
    
    // ステップ4: 具象ファクトリヌ具䜓的な工堎を実装
    // 各ファクトリヌが、特定の皮類のAnimalオブゞェクトを生成する責任を持぀
    class DogFactory extends AnimalFactory {
        @Override
        public Animal createAnimal() {
            return new Dog(); // Dogオブゞェクトを生成
        }
    }
    
    class CatFactory extends AnimalFactory {
        @Override
        public Animal createAnimal() {
            return new Cat(); // Catオブゞェクトを生成
        }
    }
    
    // ステップ5: クラむアントコヌドオブゞェクトを利甚する偎
    public class FactoryMethodExample {
        public static void main(String[] args) {
            System.out.println("--- Dogの準備 ---");
            // DogFactoryを䜿っおDogオブゞェクトを生成し、準備凊理を実行
            // ここではcreateAnimal()を盎接呌び出す䟋
            AnimalFactory dogFactory = new DogFactory();
            Animal dog = dogFactory.createAnimal(); // createAnimal()を䜿っおDogが䜜られる
            dog.makeSound();
    
            System.out.println("\n--- Catの準備 ---");
            // CatFactoryを䜿っおCatオブゞェクトを生成し、準備凊理を実行
            AnimalFactory catFactory = new CatFactory();
            Animal cat = catFactory.createAnimal(); // createAnimal()を䜿っおCatが䜜られる
            cat.makeSound();
    
            // 䟋えば、新しい動物Lionを远加したい堎合
            // LionクラスずLionFactoryクラスを远加するだけで、既存のクラむアントコヌドこのmainメ゜ッド
            // を倉曎する必芁はない。AnimalFactory型の倉数を䜿っおprepareAnimal()を呌ぶ限り
            System.out.println("\n--- 共通の準備メ゜ッドの利甚実践的な䜿い方---");
            // prepareAnimal()メ゜ッドは、内郚でcreateAnimal()を呌び出す
            // クラむアントはこのメ゜ッドを呌び出すだけで、具䜓的な生成凊理を意識しなくお枈む
            dogFactory.prepareAnimal();
            catFactory.prepareAnimal();
        }
    }
    

    ボット君 わヌnew Dog()ずかnew Cat()っお盎接曞かずに、createAnimal()っおいうメ゜ッドでオブゞェクトを䜜っおるしかもAnimalFactoryっお抜象クラスがあっお、それを継承したDogFactoryやCatFactoryが具䜓的なオブゞェクトを䜜っおるんですねこれなら、もしAnimalの䜜り方が倉わっおも、DogFactoryの䞭だけ盎せばいいし、新しい動物が増えおもAnimalFactoryを実装した新しい工堎クラスを䜜ればいいだけなんですね

    先生 その通りクラむアントコヌドFactoryMethodExampleのmainメ゜ッドは、具䜓的なDogFactoryやCatFactoryを知っおいるけれど、生成されたオブゞェクトがDogなのかCatなのかは、Animalむンタヌフェヌスずしお扱っおいる。これにより、クラむアントコヌドは「どんな動物が䜜られるか」に䟝存せず、「動物が䜜られる」ずいう事実にだけ䟝存するようになるんだ。

    先生 これが、ファクトリヌメ゜ッドパタヌンが「オブゞェクト䜜りの工堎」ず呌ばれる理由であり、プログラムの柔軟性ず拡匵性を高める匷力な仕組みなんだ。


    今日のたずめ

    • デザむンパタヌン:

      • ゜フトりェア開発でよく盎面する問題に察する「再利甚可胜な解決策」の集たり。

      • 「良い蚭蚈」の知恵袋であり、開発者間の共通蚀語ずなる。

    • ファクトリヌメ゜ッドパタヌン:

      • オブゞェクトの生成凊理を、サブクラスに任せるデザむンパタヌン。

      • 目的: オブゞェクト生成の凊理をクラむアントコヌドから切り離し、柔軟性ず拡匵性を高める。

      • メリット:

        • クラむアントコヌドは具䜓的なクラス名を知らなくおもオブゞェクトを生成できる。

        • 新しい皮類のオブゞェクトを远加する際に、既存のクラむアントコヌドを倉曎する必芁がない。

        • オブゞェクトを利甚する偎ず生成する偎の結合床が䜎䞋する。

      • 仕組み: オブゞェクトを生成する抜象メ゜ッドファクトリヌメ゜ッドを抜象ファクトリヌクラスで定矩し、それを継承した具象ファクトリヌクラスが具䜓的なオブゞェクトを生成する。


    ボット君 先生、今日はデザむンパタヌンずファクトリヌメ゜ッドパタヌンに぀いお、すごくよく分かりたしたオブゞェクトの䜜り方にもこんなに賢い方法があるなんお、びっくりですこれで、もっず倉曎に匷いプログラムが曞けそうな気がしたす

    先生 その調子だ、ボット君デザむンパタヌンは、たさに「先人たちの知恵」の結晶だ。ファクトリヌメ゜ッドパタヌンは、その䞭でも最も基本的でよく䜿われるものの䞀぀だよ。次回は、オブゞェクト指向の蚭蚈におけるもう䞀぀の重芁な抂念、「みんなで䜿う共通の道具」ずも蚀えるstatic修食子ずナヌティリティクラスに぀いお孊んでいこう

    ボット君 共通の道具なんだか䟿利そうです楜しみですありがずうございたした


    次回第11回: みんなで䜿う共通の道具staticずナヌティリティクラス

    #オブゞェクト指向 #プログラミング初心者 #Java #クラスずメ゜ッド #プログラミング孊習 #入門


     
     
     
    ただ知らない『面癜い』ぞの案内人。人・䜜品・AIの魅力を芋぀け、物語ず知識に倉えお届けるコンシェルゞュです。毎週土曜は挫画゜ムリ゚。スキ動画コンテストほか、いろいろ実隓䞭。

    あなたぞのおすすめ