[読書ノート]Javaデザインモード-ファクトリメソッドモード


=>抽象ファクトリロール: コアは、アプリケーションに関係なく、モードでオブジェクトを作成するファクトリクラスがこのインタフェースを実装する必要があります.
=>特定のファクトリロール:抽象ファクトリインタフェースの具体的な実装.アプリケーションと密接な論理があり、アプリケーションによって呼び出されて製品オブジェクトを作成します.
=> 抽象プロダクトロール:ファクトリメソッドモードで作成されたオブジェクトの親または共通のインタフェース.通常、Java抽象クラスまたはJavaインタフェースで実装されます.
=> 具体的な製品ロール:ファクトリメソッドモードで作成されたオブジェクトは、通常、特定のJavaクラスによって実装されます.
 
 
/**
 *     (Creator)   
 */
package com.jack.dp.factorymethod;

public interface FruitGardener {
	
	Fruit factory();
}

 
 
/**
 *     (Concrete Creator)   
 */
package com.jack.dp.factorymethod;

public class AppleGardener implements FruitGardener {

	@Override
	public Fruit factory() {
		return new Apple();
	}

}

 
/**
 *     (Concrete Creator)   
 */
package com.jack.dp.factorymethod;

public class GrapeGardener implements FruitGardener {

	@Override
	public Fruit factory() {
		return new Grape();
	}

} 

 
 
/**
 *     (Product)   
 */
package com.jack.dp.factorymethod;

public interface Fruit {

    void grow();  
	  
    void plant();  
  
    void harvest(); 
}

 
 
/**
 *     (Concrete Product)  
 */
package com.jack.dp.factorymethod;

public class Apple implements Fruit {

	@Override
	public void grow() {
		System.out.println("Apple is growing--------------");
	}

	@Override
	public void plant() {
		System.out.println("Apple is planting--------------");
	}

	@Override
	public void harvest() {
		System.out.println("Apple is harvesting--------------");
	}

}

 
 
/**
 *     (Concrete Product)  
 */
package com.jack.dp.factorymethod;

public class Grape implements Fruit {

	@Override
	public void grow() {
		System.out.println("Grape is growing--------------");
	}

	@Override
	public void plant() {
		System.out.println("Grape is planting--------------");
	}

	@Override
	public void harvest() {
		System.out.println("Grape is harvesting--------------");
	}

}

 
 
package com.jack.dp.factorymethod;

public class Test {

	private static FruitGardener gardener;
	private static Fruit fruit;
	public static void main(String[] args) {
		
		gardener = new AppleGardener();
		fruit = gardener.factory();
		fruit.plant();
		fruit.grow();
		fruit.harvest();
		
		gardener = new GrapeGardener();
		fruit = gardener.factory();
		fruit.plant();
		fruit.grow();
		fruit.harvest();
	}

}

 
 
=> メリット:
              1.工场クラスはすべての制品の作成を担当するのではなく、具体的に作成した仕事をサブクラス工场に任せる.コアクラスは抽象工场の役割になり、具体的な工场クラスが実现しなければならないインタフェースを与えるだけで、どの制品クラスがインスタンス化されるべきかの详细に触れない.
      2.さらに抽象化した結果、工場方法モデルは具体的な工場の役割を修正することなく新しい製品を導入することができるようになった.
 
 
=> 適用: EJBテクノロジーアーキテクチャにおけるファクトリメソッドモデル
 
//    JNDI naming context
Context ctx = new InitialContext();
//    ctx    EJB Home   
EmployeeHome home = (EmployeeHome)ctx.lookup("Employee");
//    Home        Session Bean   
//                
Employee emp = home.create(1001, "John", "Smith');
//     
emp.setTel("212-657-7879");