[디자인패턴][생성][프로토타입]

SEUNGJUN·2024년 3월 14일
post-thumbnail

기존 객체를 복제하여 새로운 객체를 생성하는 패턴, 객체를 생성하는 데 드는 비용을 줄이고, 복잡한 객체를 쉽게 생성할 수 있도록 한다.

간단한 예로, 메시지를 전송하는 애플리케이션을 만들고 있다고 할때, 애플리케이션은 여러 종류의 메시지를 생성하고 전송할 수 있어야 한다. 메시지의 형식은 각각 다르지만, 전송하는 방법은 동일하다.

[메시지 전송기] <--- 복제를 수행

메시지 전송하는 코드

<ProtoType 패턴 적용 전>

// Email 메시지 클래스
class EmailMessage {
    private String recipient;
    private String subject;
    private String content;

    public EmailMessage(String recipient, String subject, String content) {
        this.recipient = recipient;
        this.subject = subject;
        this.content = content;
    }

    public void sendMessage() {
        System.out.println("Email sent to " + recipient + " with subject: " + subject);
    }
}

// SMS 메시지 클래스
class SMSMessage {
    private String phoneNumber;
    private String message;

    public SMSMessage(String phoneNumber, String message) {
        this.phoneNumber = phoneNumber;
        this.message = message;
    }

    public void sendMessage() {
        System.out.println("SMS sent to " + phoneNumber + ": " + message);
    }
}

// Client 클래스
public class Client {
    public static void main(String[] args) {
        // 원본 메시지 생성
        EmailMessage originalEmail = new EmailMessage("example@example.com", "Test Email", "This is a test email");
        SMSMessage originalSMS = new SMSMessage("123456789", "This is a test SMS");

        // 메시지 전송
        originalEmail.sendMessage();
        originalSMS.sendMessage();
    }
}

첫 번째 코드는 메시지를 생성할 때마다 해당 메시지 클래스의 생성자를 호출하여 새로운 객체를 생성한다. 이렇게 생성된 객체는 각각의 클래스에 정의된 sendMessage() 메서드를 호출하여 메시지를 전송한다. 이렇게 되면 각 메시지 형식에 대해 별도의 클래스를 생성하고, 메시지를 생성하고 전송하는 기능을 각 클래스에 중복해서 구현을 해야한다.

<ProtoType 패턴 적용 후>

// Prototype 인터페이스
interface MessagePrototype {
    MessagePrototype clone();
    void sendMessage();
}

// Email 메시지 클래스
class EmailMessage implements MessagePrototype {
    private String recipient;
    private String subject;
    private String content;

    public EmailMessage(String recipient, String subject, String content) {
        this.recipient = recipient;
        this.subject = subject;
        this.content = content;
    }

    // 복제 메서드 구현
    @Override
    public MessagePrototype clone() {
        return new EmailMessage(this.recipient, this.subject, this.content);
    }

    @Override
    public void sendMessage() {
        System.out.println("Email sent to " + recipient + " with subject: " + subject);
    }
}

// SMS 메시지 클래스
class SMSMessage implements MessagePrototype {
    private String phoneNumber;
    private String message;

    public SMSMessage(String phoneNumber, String message) {
        this.phoneNumber = phoneNumber;
        this.message = message;
    }

    // 복제 메서드 구현
    @Override
    public MessagePrototype clone() {
        return new SMSMessage(this.phoneNumber, this.message);
    }

    @Override
    public void sendMessage() {
        System.out.println("SMS sent to " + phoneNumber + ": " + message);
    }
}

// Client 클래스
public class Client {
    public static void main(String[] args) {
        // 원본 메시지 생성
        EmailMessage originalEmail = new EmailMessage("example@example.com", "Test Email", "This is a test email");
        SMSMessage originalSMS = new SMSMessage("123456789", "This is a test SMS");

        // 메시지 복제
        EmailMessage clonedEmail = (EmailMessage) originalEmail.clone();
        SMSMessage clonedSMS = (SMSMessage) originalSMS.clone();

        // 메시지 전송
        clonedEmail.sendMessage();
        clonedSMS.sendMessage();
    }
}

두 번째 코드는 프로토타입 패턴을 사용하여 메시지를 생성한다. 각 메시지 클래스는 MessagePrototype 인터페이스를 구현하고, clone() 메서드를 통해서 객체를 복제한다. 따라서, 새로운 메시지를 생성할 때는 원본 메시지를 복제하여 새로운 객체를 생성한다. 이렇게 생성된 객체는 동일한 인터페이스를 통해 sendMessage() 메서드를 호출하여 메시지를 전송한다. 이렇게 되면 메시지 생성 및 전송의 중복을 피하고, 객체 생성에 대한 비용을 줄일수가 있다.

profile
RECORD DEVELOPER

0개의 댓글