본문 바로가기
Development/DesignPatten

[디자인패턴] DesignPattern04 - Prototype

by 푸민 2016. 12. 16.
반응형



안녕하세요 푸민입니다.

오늘은 디자인 패턴 중에서 프로토 타입에 대해서 알아보겠습니다!



1. 개요


프로토 타입하면 떠오르는 이미지가 다들 있으실거에요!! 보통은 제품의 프로토 타입이라고 해서 출시하기 전에 빠르게 만들어내는 초기 제품을 뜻하는데요. 디자인패턴에서는 조~금 다른 의미인거 같아요!!


초기에 제품보다는 어떠한 객체를 대표하는 객체를 프로토 타입이라고 명칭하는것 같아요! 즉 후라이드치킨, 양념치킨의 프로토타입은 치킨이 되는것이죠!


제가 이전에 썻던 팩토리 메소드 패턴(http://fumin.tistory.com/588)이 있는데요. 이 패턴과 마찬가지로 굉장히 많이 사용하는 패턴 중에 하나랍니다! 두 패턴이 굉장히 비슷하고 실제 효과는 같은데요. 다른 점은 팩토리 패턴의 경우 객체를 우리가 직접 지정해 주는 방식이고, 프로토타입의 경우는 메소드 내에서 판단하여 객체를 복제하는 방식입니다!!



(이미지출처 : 위키백과)



2. 구현방법


- 먼저 구현하고자 하는 객체의 프로토 타입을 생성한다.


- 해당 프로토 타입을 상속 받은 객체를 구현한다.


- 객체를 사용하기 원하는 곳에 프로토타입을 이용하여 복제한다.




3. 예제

예약어 객체 인터페이스 변수및문자열

interface Chicken {

    public String getName();

}


class FriedChicken implements Chicken, Cloneable {

    public String getName(){

        return "후라이드 치킨."

    }

    

    public Object clone(){

        return (FriedChicken) super.clone();

    }


class SpicyChicken implements Chicken, Cloneable {

    public String getName(){

        return "양념 치킨."

    }

    

    public Object clone(){

        return (SpicyChicken) super.clone();

    }


enum type{ FRIED, SPICY }


class ChickenMaker {

    private Chicken friedChicken;
    private Chicken spicyChicken;

    public ChickenMaker{

        friedChicken = new FriedChicken();
        spicyChicken = new SpicyChicken();

    }


    public Chicken cook(enum type){

        if(type == FRIED){

            return friedChicken.clone();

        }

        else{

            return spicyChicken.clone();

        }

    }


    public void main(){

        ChickenMaker maker = new ChickenMaker();

        for(int i = 0 ; i < 10 ; i++){

            if(i%2=0){
                maker.cook(type.FRIED);

            }

            else {

                maker.cook(type.SPICY);

            }

        }

    }



4. 예제 설명


- 먼저 Chicken 의 속성을 정의한 interface를 만들어 준다.


- 해당 interface 와 Cloneable 을 구현하는 Fried, SpicyChicken을 만들다.


- 그리고 추상팩토리인 ChickenMaker를 만든다. 해당 객체는 enum type으로 각각 Chicken 객체의 종류만큼 써준다.


- ChickenMaker 는 치킨을 만들어보았기 때문에 각각 치킨에 대한 정보를 가지고 있다.( friedChicken, spacyChicen)


- 그리고 ChickenMaker에 cook() 메소드를 추가하고 메인에서 복제하기 원하는 객체의 enum 값을 전다.








반응형

댓글