🏓 設計モード2:テンプレートメソッドモード、ファクトリメソッドモード、抽象ファクトリモード🏓


😽 リファレンス😽


headfirst Design Patternを参考に勉強しました.
以下のブログと記事を参照してください.
gmlwjd9405.github.io
OmarElGabry/DesignPatterns
quanke/design-pattern-java-source-code
yaboong.github.io

😼 ソースコード😼


https://github.com/bo-yoon/DesignPattern

▼▼▼テンプレートメソッドアレイ(動作モード)▼


  • テンプレートメソッドパターンは,その名の通りテンプレート,プログラムのスケルトンである.複数の人がそれぞれのコードを同時に作成し、後でマージする場合は、共通に使用される部分や変わらない部分については、予め定義する必要があります.この場合はテンプレートメソッドモードを使用します.

  • 例えば、ResponseDTOの場合、共通応答部分は予め定義されている.

  • テンプレートメソッドモードでは、抽象クライスで簡単な基本コンテンツが実装されているか、コードが実装されていないコードを指すフックが使用されます.したがって、抽象クライスを継承するサブクラスは、ここで追加のコードを実装する.

  • ソースコード

    
    package templeteMethod;
    
    public abstract class AbstractDoit {
    	
    	protected abstract void primitive();
    	
    	protected abstract void hook();
    	
    	public void templeteMethod() {
    		
    		primitive();
    		hook();
    		
    	}
    }
    
    package templeteMethod;
    
    public class WeekDayDoit extends AbstractDoit {
    	
    	@Override
    	protected void primitive() {
    		System.out.println("집가서 잠자기 ");
    		System.out.println("게임 한 판 ");
    	}
    	
    	@Override
    	protected void hook() {
    		System.out.println("그전에 퇴근 먼저");
    	}
    }
    
    
    package templeteMethod;
    
    public class Main {
    	public static void main(String [] args) {
    		
    		AbstractDoit todo = new WeekDayDoit();
    		todo.templeteMethod();
    	}
    }
    

    ▼ファクトリメソッドアレイ(アレイ作成)▼

  • ファクトリメソッドモードは、上述したテンプレートメソッドモードを用いたモードである.まず、オブジェクトを作成するインタフェースを定義し、実装クラスの役割をサブクラスに渡します.つまり、工場類を使います.1つのファクトリで1つの方法で作成され、複数のオブジェクトが作成されます.
  • ファクトリメソッドモデルの目的は、図中の顧客作成者および製品への依存性を低減し、単一のメソッドによって実現することである.これは,以下で紹介する抽象工場モデルとの違いである.

  • ソースコード
    package factoryMethod;
    
    public class StrawberryJuice {
    
    
    	public void flavor() {
    		System.out.println("딸기 맛 쥬스");
    	}
    }
    
    
    public abstract class DrinkFactory {
    	abstract StrawberryJuice maker(String juice);
    }
    
    package factoryMethod;
    
    public class JuiceFactory extends DrinkFactory{
    	
    	public Juice maker(String juice) {
    		
    		if(juice.equals("STRAWBERRY")) {
    			return new StrawberryJuice();
    		}
    		
    		return null;
    		
    	}
    }
    
    

    抽象ファクトリモード(作成モード)


  • ファクトリクラスで生成する方法はいろいろあります.つまり、一つの工場がファミリーセットです.

  • 必要に応じて依存性を注入してオブジェクトを作成します.

  • ソースコード

    
    package abstFactory;
    
    public interface BeverageFactory {
    	
    	public Beverage maker(String kind);
    }
    
    
    package abstFactory;
    
    public class CoffeeFactory implements BeverageFactory {
    	
    	@Override
    	public Beverage maker(String kind) {
    		 
    			kind =  kind.toUpperCase();
    			
    			if(kind.equals("AMERICANO")) {
    				return new Americano();
    			}
    		
    			return null;
    	}
    }
    
    
    
    package abstFactory;
    
    public class JuiceFactory implements BeverageFactory {
    	
    	@Override
    	public Beverage maker(String kind) {
    		kind = kind.toUpperCase();
    		
    		if(kind.equals("STRAWBERRY")) {
    			return new StrawberryJuice();
    		}else if(kind.equals("BANANA")){
    			return new BananaJuice();
    		}
    		
    		return null;
    		
    	}
    }
    
    
    
    package abstFactory;
    
    public interface Beverage {
    
    	public void flavor();
    }
    
    
    
    package abstFactory;
    
    public abstract class Coffee implements Beverage{
    	
    
    }
    
    
    package abstFactory;
    
    
    public class Americano extends Coffee {
    	
    	@Override
    	public void flavor() {
    		System.out.println("아메리카노~ 좋아 좋아 좋아~");
    	}
    }
    package abstFactory;
    
    public abstract class Juice implements Beverage {
    
    }
    
    package abstFactory;
    
    public class BananaJuice extends Juice{
    	
    	@Override
    	public void flavor() {
    		System.out.println("바나나 맛 주스!");
    	}
    }
    
    
    
    
    package abstFactory;
    
    public class BananaJuice extends Juice{
    	
    	@Override
    	public void flavor() {
    		System.out.println("바나나 맛 주스!");
    	}
    }
    
    
    package abstFactory;
    
    public class Main {
    	public static void main(String [] args) {
    		
    		BeverageFactory fac = new CoffeeFactory();
    		
    		Beverage coffee = fac.maker("americano");
    		
    		coffee.flavor();
    		
    		fac = new JuiceFactory();
    		
    		Beverage juice = fac.maker("banana");
    		juice.flavor();
    		
    		
    		
    	}
    }
    아메리카노~ 좋아 좋아 좋아~
    바나나 맛 주스!