Modern C++ Design Pattern/Chatper 4. 프로토타입

created : 2020-04-07T11:44:17+00:00
modified : 2020-09-26T14:16:07+00:00

객체 생성

  • 같은 값으로 중복되게 초기화 되는 작업이 발생

    중복처리

    ```cpp struct Address { string street, city; int suite; } struct Contact { string name; Address address; }

struct Contact { string name; Address* address; }

* 복제 생성자를 통한 중복 초기화
* 복제 생성자를 배제하고 별도의 인터페이스
```cpp
template <typename T> struct Clonable
{
  virtual T clone() const = 0;
}

직렬화(Serialization)

struct Contact
{
  string name;
  Address* address = nullptr;
  private:
  friend class boost:serialization::access;
  template<class Ar> void serialize(Ar& ar, const unsigned int version)
  {
    ar & name;
    ar & address; // *가 없다는 것에 주의
  }
};


auto clone = [](const Contact& c)
{
  ostringstream oss;
  boost::achive::text_oarchive oa(oss);
  oa << c;
  string s = oss.str();

  istringstream iss(oss.str());
  boost::arhive::text_iarchive ia(iss);
  Contact result;
  ia >> result;
  return result;
}

프로토타입 팩터리

struct EmployeeFactory
{
  static Contact main;
  static Contact aux;

  static unique_ptr<Contact> NewMainOfficeEmployee(string name, int suite)
  {
    return NewEmployee(name, suite, main);
  }

  static unique_ptr<Contact> NewAuxOfficeEmployee(string name, int suite)
  {
    return NewEmployee(name, suite, aux);
  }

  private:
  static unique_ptr<Contact> NewEmployee(string name, int suite, Contact& proto)
  {
    auto result = make_unique<Contact>(proto);
    result->name = name;
    result->address->suite = suite;
    return result;
  }
};

요약

  • 객체의 깊은 복제를 올바르게 수행하는 코드를 작성한다. 복제 생성자나 복제 대입 연산자를 구현할 수 도 있고 별도의 맴버 함수를 만들 수도 있다.
  • 직렬화/역직렬화 기능을 구현하여, 직렬화 직후 역직렬화를 하는 방법으로 복제를 한다. 이 방법은 부가적인 연산 비용이 발생한다.