프로그래밍/자바 디자인패턴

디자인 패턴 Factory Method 패턴

가카리 2012. 8. 3. 19:34
반응형

Factory Method 패턴

 

인스턴스를 만드는 방법은 상위클래스 측에서 결정하지만 구체적인 클래스 이름까지는 결정하지않습니다. 구체적인 내용은 하위 클래스 측에서 수행합니다.

 

 

아래 소스를 보면 Factory 클래스는 제품을 구체적으로 어떻게 만드는지는 말하지않고 만들고 제품을 등록한다 이 정도만 정의를 하게됩니다.

 

 

 

 

package framework;

 

public abstract class Factory {

      

       //Template Method패턴을 사용함 Factory에서는 Product 생산하고

       public final Product create(String owner){

             Product p = createProduct(owner);

             registerProduct(p);

             return p;

       }

       //아래는 하위클래스에서 구체화함

       protected abstract Product createProduct(String owner);

       protected abstract void registerProduct(Product product);

}

 

 

Product의 경우 사용한다 정도의 메소드만 있으면됩니다.

package framework;

 

public abstract class Product {

       public abstract void use();

}

 

 

package idcard;

 

import java.util.ArrayList;

import java.util.List;

 

import framework.Factory;

import framework.Product;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//이제 제품을 구체적으로 어떻게 만드는지에 대해서 정의해줍니다.

//여기서는 간단히 new IDCard(owner) 이용해서 인스턴스(제품) 만들었습니다.

//그리고 등록하는 방법에 대해서도 구체화해야되므로 리스트를 만들어서 등록하는 것을 구현했습니다.

public class IDCardFactory extends Factory{

       private List owners = new ArrayList();

 

       @Override

       protected Product createProduct(String owner) {

             // TODO Auto-generated method stub

             return new IDCard(owner);

       }

 

       @Override

       protected void registerProduct(Product product) {

             // TODO Auto-generated method stub

             owners.add(((IDCard)product).getOwner());

       //IDCard클래스의 부모클래스는 Product이므로 위와같이 자식클래스로 형변환을 하고

       //자식 클래스의 메소드인 getOwner 호출한다. (IDCard)product.getOwner()이면

       //반환값을 (IDCard) 바꾼다는 뜻이므로 위와같이 해주어야한다.

       }

       public List getOwners(){

             return owners;

       }

}

 

 

 

 

//IDCard는 클래스는 어떻게 사용한다는 것(use메소드)만 구체적으로 구현을 해주었습니다.

//그리고 생성자를 만들어줬을뿐입니다.(생성자는 역시 IDCardFactory에서 쓰이겠죠? 구체적으로 어떻게 만드는것은 구현하니까

package idcard;

 

import framework.Product;

 

public class IDCard extends Product{

       private String owner;

      

       IDCard(String owner){

             System.out.println(owner + " 카드를 만듭니다.");

             this.owner = owner;

       }

       @Override

       public void use() {

             // TODO Auto-generated method stub

             System.out.println(owner + " 카드를 사용합니다.");

       }

       public String getOwner(){

             return owner;

       }

      

      

}

 

 

 

//메인에서는 IDCard가 구체적으로 어떻게 만들어지는지는 몰라도됩니다.

//간단히 공장을 짓고(IDCardFactory클래스를 만들고) 생산을 하면됩니다(create메소드)

import idcard.IDCardFactory;

import framework.Factory;

import framework.Product;

 

 

public class Main {

 

       /**

        * @param args

        */

       public static void main(String[] args) {

             // TODO Auto-generated method stub

             Factory factory = new IDCardFactory();

             Product card1 = factory.create("홍길동");

             Product card2 = factory.create("이순신");

             Product card3 = factory.create("강감찬");

      

             card1.use();

             card2.use();

             card3.use();

       }

 

 

}

 

 

 

반응형