수색…


소개

프로토 타입 패턴은 기존 프로토 타입 오브젝트를 복제하여 새 오브젝트를 작성하는 작성 패턴입니다. 프로토 타입 패턴은 객체 복사가 더 빠를 때 클래스의 인스턴스 생성 속도를 높입니다.

비고

프로토 타입 패턴은 창조적 인 디자인 패턴입니다. 생성 할 객체의 유형이 새로운 객체를 생성하기 위해 "복제 된" 프로토 타입 인스턴스에 의해 결정될 때 사용됩니다.

이 패턴은 클래스가 "다형성 (복사본) 생성자"를 필요로 할 때 사용됩니다.

프로토 타입 패턴 (C ++)

class IPrototype  {
public:
    virtual ~IPrototype() = default;

    auto Clone() const { return std::unique_ptr<IPrototype>{DoClone()}; }
    auto Create() const { return std::unique_ptr<IPrototype>{DoCreate()}; }

private:
    virtual IPrototype* DoClone() const = 0;
    virtual IPrototype* DoCreate() const = 0;
};

class A : public IPrototype {
public:
    auto Clone() const { return std::unique_ptr<A>{DoClone()}; }
    auto Create() const { return std::unique_ptr<A>{DoCreate()}; }
private:
    // Use covariant return type :)
    A* DoClone() const override { return new A(*this); }
    A* DoCreate() const override { return new A; }
};

class B : public IPrototype {
public:
    auto Clone() const { return std::unique_ptr<B>{DoClone()}; }
    auto Create() const { return std::unique_ptr<B>{DoCreate()}; }
private:
    // Use covariant return type :)
    B* DoClone() const override { return new B(*this); }
    B* DoCreate() const override { return new B; }
};


class ChildA : public A {
public:
    auto Clone() const { return std::unique_ptr<ChildA>{DoClone()}; }
    auto Create() const { return std::unique_ptr<ChildA>{DoCreate()}; }

private:
    // Use covariant return type :)
    ChildA* DoClone() const override { return new ChildA(*this); }
    ChildA* DoCreate() const override { return new ChildA; }
};

이를 통해 기본 클래스 포인터에서 파생 클래스를 생성 할 수 있습니다.

ChildA childA;
A& a = childA;
IPrototype& prototype = a;

// Each of the following will create a copy of `ChildA`:
std::unique_ptr<ChildA> clone1 = childA.Clone();
std::unique_ptr<A> clone2 = a.Clone();
std::unique_ptr<IPrototype> clone3 = prototype.Clone();

// Each of the following will create a new default instance `ChildA`:
std::unique_ptr<ChildA> instance1 = childA.Create();
std::unique_ptr<A> instance2 = a.Create();
std::unique_ptr<IPrototype> instance3 = prototype.Create();

프로토 타입 패턴 (C #)

프로토 타입 패턴은 .NET의 ICloneable 인터페이스를 사용하여 구현할 수 있습니다.

class Spoon {
}
class DessertSpoon : Spoon, ICloneable {
  ...
  public object Clone() {
    return this.MemberwiseClone();
  }
}
class SoupSpoon : Spoon, ICloneable {
  ...
  public object Clone() {
    return this.MemberwiseClone();
  }
}

프로토 타입 패턴 (JavaScript)

Java, C # 또는 C ++와 같은 고전 언어에서는 클래스를 생성 한 다음 클래스에서 새 객체를 만들거나 클래스를 확장 할 수 있습니다.

자바 스크립트에서 먼저 객체를 생성 한 다음 객체를 확장하거나 객체를 새로 만들 수 있습니다. 그래서 JavaScript는 고전 언어보다 실제 프로토 타입을 보여줍니다.

예 :

var myApp = myApp || {};

myApp.Customer = function (){
    this.create = function () {
        return "customer added";
    }
};

myApp.Customer.prototype = {
    read: function (id) {
        return "this is the customer with id = " + id;
    },
    update: function () {
        return "customer updated";
    },
    remove: function () {
        return "customer removed";
    }
};

여기서 Customer 라는 객체를 만든 다음 새 객체 를 만들지 않고 prototype 키워드를 사용하여 기존 Customer object 를 확장했습니다. 이 기술을 프로토 타입 패턴이라고 합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow