디자인 패턴 ~ Prototype ~

1. 소개



GoF의 디자인 패턴에서 Prototype 패턴을 요약합니다.

2. Prototype 패턴이란?


  • Prototype이라는 영어 단어는 원형과 모범이라는 의미입니다.
  • Prototype 패턴은 new xxx()로 클래스에서 인스턴스를 생성하는 대신 인스턴스에서 다른 인스턴스를 만드는 방법입니다.
  • 복제를 만드는 조작을 clone이라고 합니다.
  • GoF 디자인 패턴은 생성과 관련된 디자인 패턴으로 분류됩니다.

  • 3. 샘플 클래스 다이어그램





    4. 샘플 프로그램



    입력한 문자열에 밑줄을 긋거나 둘러싸는 프로그램입니다.

    4-1. Product 인터페이스



    복제 메소드를 정의하는 인터페이스입니다. java의 Cloneable 인터페이스를 상속합니다.

    Product.java
    package framework;
    import java.lang.Cloneable;
    
    public interface Product extends Cloneable {
        public abstract void use(String s);
        public abstract Product createClone();
    }
    

    4-2. Manager 클래스



    Product의 작성 지시나 관리를 실시하는 클래스입니다.

    Manager.java
    package framework;
    import java.util.HashMap;
    
    public class Manager {
    
        private HashMap showcase = new HashMap();
    
        public void register(String name, Product proto) {
            showcase.put(name, proto);
        }
    
        public Product create(String protoname) {
            Product p = (Product)showcase.get(protoname);
            return p.createClone();
        }
    }
    

    4-3. UnderlinePen 클래스



    Product 인터페이스를 구현하는 클래스입니다. 당 클래스는 「문자에 밑줄을 긋는」클래스가 됩니다.

    UnderlinePen.java
    import framework.Product;
    
    public class UnderlinePen implements Product {
    
        private char ulchar;
    
        public UnderlinePen(char ulchar) {
            this.ulchar = ulchar;
        }
    
        public void use(String s) {
    
            int length = s.getBytes().length;
    
            System.out.println(s);
    
            for (int i = 0; i < length; i++) {
                System.out.print(ulchar);
            }
    
            System.out.println("");
        }
    
        public Product createClone() {
            Product p = null;
            try {
                p = (Product)clone();
            } catch (CloneNotSupportedException e) {
                // オブジェクトのクラスがCloneableインタフェースを実装していない場合にスローされる例外
                e.printStackTrace();
            }
            return p;
        }
    }
    

    4-4. MessageBox 클래스



    Product 인터페이스를 구현하는 클래스입니다. 당 클래스는 「문자를 둘러싸는」클래스가 됩니다.

    MessageBox.java
    import framework.Product;
    
    public class MessageBox implements Product {
    
        private char decochar;
    
        public MessageBox(char decochar) {
            this.decochar = decochar;
        }
    
        public void use(String s) {
    
            int length = s.getBytes().length;
    
            for (int i = 0; i < length + 2; i++) {
                System.out.print(decochar);
            }
    
            System.out.println("");
            System.out.println(decochar + s + decochar);
    
            for (int i = 0; i < length + 2; i++) {
                System.out.print(decochar);
            }
    
            System.out.println("");
        }
    
        public Product createClone() {
            Product p = null;
            try {
                p = (Product)clone();
            } catch (CloneNotSupportedException e) {
                // オブジェクトのクラスがCloneableインタフェースを実装していない場合にスローされる例外
                e.printStackTrace();
            }
            return p;
        }
    }
    

    4-5. Main 클래스



    메인 처리를 실시하는 클래스입니다.

    Main.java
    import framework.Manager;
    import framework.Product;
    
    public class Main {
        public static void main(String[] args) {
    
            Manager manager = new Manager();
            UnderlinePen upen = new UnderlinePen('~');
            MessageBox mbox = new MessageBox('*');
            MessageBox pbox = new MessageBox('+');
            manager.register("strong message", upen);
            manager.register("warning box", mbox);
            manager.register("slash box", pbox);
    
            Product p1 = manager.create("strong message");
            p1.use("Hello world");
            Product p2 = manager.create("warning box");
            p2.use("Hello world");
            Product p3 = manager.create("slash box");
            p3.use("Hello world");
        }
    }
    

    4-6. 실행 결과


    Hello World
    ===========
    *************
    *Hello World*
    *************
    +++++++++++++
    +Hello World+
    +++++++++++++
    

    5. 장점



    샘플 프로그램에서는 비교적 단순한 경우였지만, 인스턴스를 생성하는데 있어서 복잡한 처리가 필요하거나 시간이 걸리는 처리가 필요할 수도 있습니다. 인스턴스를 생성할 때마다 new xxx()로서는 매우 비효율적입니다.
    Prototype(제형)을 만들어 두고 복사하는 것만으로 간단하게 인스턴스를 생성할 수 있습니다.

    6. GitHub


  • htps : // 기주 b. 코 m / 이타나카 730 /

  • 7. 디자인 패턴 목록


  • GoF 디자인 패턴 요약

  • 8. 참고



    이번 기사 및 샘플 프로그램은 이하의 서적을 바탕으로 작성하였습니다.
  • Java 언어로 배우는 디자인 패턴 입문

  • 매우 이해하기 쉽고 공부가되었습니다. 감사합니다.
    디자인 패턴이나 샘플 프로그램에 대한 설명이 상세하게 쓰여져 있으므로, 꼭 서적의 분도 봐 주세요.

    좋은 웹페이지 즐겨찾기