📌템플릿 메소드 패턴을 인스턴스(객체) 생성의 장면에 적용한 것
📌인스턴스를 만드는 방법을 상위 클래스에서 결정-> 구체적인 내용은 하위 클래스에서 수행
패키지 1 - framework) - 골격 역할 (인스턴스 생성)
🔳 Product class (추상 클래스) : 추상 메소드 use 정의
🔳 Factory class (추상 클래스) : 매소드 create 구현, 추상메소드 createProduct, registerProduct 정의
패키지 2 - idcard ) -구체적 내용 구현 역할
🔳 IDCard class : 메소드 use 구현
🔳 IDCardFactory class : 메소드 createProduct, registerProduct 구현
▪️main class
제품을 표현하는 클래스
제품: "무엇이든 use 할 수 있는 것 "
package framework;
public abstract class Product{
public abstract void use();
}
Template method 패턴이 사용됨
공장 : create 메소드에서 Product의 인스턴스를 생성하는 것
create메소드 : createProduct()에서 구체적 제품을 만들어서 registerProduct()에 등록한다.
package framework;
public abstract class Factory{
public final Product create(String owner){
Product p= createProduct(owner);
registerProduct(p); //등록한다
return p;
}
public abstract void registerProduct();
public abstract void createProduct();
}
구체적 실행하는 측 = 구체적인 신분증을 만드는
Product클래스를 상속받는다 -> use() 구현
package idcard;
import framework.*;
public class IDCard extends Product{
private String name;
IDCard(String owner){
System.out.print(owner+"의 신분증을 만듭니다");
this.name= name;
}
public void use(){
System.out.print(owner+"의 신분증을 사용합니다");
}
public String getOwner(){
return owner;
}
}
카드 주인 목록 (카드 공장)
createProduct(), registerProduct()에 대한 구현
-> 제품을 만드는 일
package idcard;
import framework.*;
import java.util.*;
public class IDCardFactory extends Factory{
private List ownerList=new ArrayList(); //등록자들을 모아둔 리스트
public void createProduct(String owner){
return new IDCrard(owner) ; //카드 객체를 만들어서 반환
}
public void registerProduct(Product product){
ownerList.add(((IDCard)product).getowner());
//카드 만든 사람을 리스트에 등록함(add)
}
public List getOwnerList(){ //등록된 리스트를 반환
return OwnerList;
}
}
import framework.*;
import idcard.*;
public class Main{
public static void main(String[] args){
Factory factory= new IDCardFactory();
Product p1= factory.create("이순신") //만들고 등록까지 마치고
Product p1= factory.create("이산신")
Product p1= factory.create("이만신")
Product p1= factory.create("이수신")
p1.use(); //사용
p2.use();
p3.use();
}
}