07. Prototype Pattern
HomeDesign PatternC++

07. Prototype Pattern

Prototype pattern implementation

10. Abstract & Concrete Class
09. Virtual Destructor
08. Template Method Pattern

DesignPattern

Intent

  • Creates a new instance which is the same as the prototype instance by using polymorphism.

Explain

In the example code for the previous post, LSP, is it possible to copy a specific instance? If second instance in the vector should be copied, how can we copy it? From the vector, we only know the parent type of the target instance, not itself.

If each class keeps its class type in a member variable, this problem can be solved easily. However, it may requires many changes, such as condition for each class type. This violates OCP.

For this problem, prototype pattern is a good solution. It is called Virtual Copy Constructor, alternatively. As prototype pattern, each class has clone() to copy prototype instance to a new instance. Code 1 shows how to implement prototype pattern.

// 01_C_Prototype.cpp
#include <iostream>
#include <vector>
using namespace std;

class BaseClass
{
public:
    virtual void foo()
    {
        cout << "Foo for Base class" << endl;
    }

    virtual BaseClass* clone()
    {
        return new BaseClass(*this);
    }
};

class DerivedClassFirst : public BaseClass
{
public:
    virtual void foo() override
    {
        cout << "Foo for First derived class" << endl;
    }

    DerivedClassFirst* clone() override
    {
        return new DerivedClassFirst(*this);
    }
};

class DerivedClassSecond : public BaseClass
{
public:
    virtual void foo() override
    {
        cout << "Foo for Second derived class" << endl;
    }

    DerivedClassSecond* clone() override
    {
        return new DerivedClassSecond(*this);
    }
};

int main()
{
    vector v;

    v.push_back(new DerivedClassFirst);
    v.push_back(new DerivedClassSecond);

    int size = v.size();
    for(int i = 0; i < size; i++)
    {
        v.push_back(v[i]->clone());
    }

    for(BaseClass* p : v)
    {
        p->foo();
    }

    return 0;
}
// Compile: clang++ -std=c++14
//              -o 01_C_Prototype 01_C_Prototype.cpp
C++
Code 1. Prototype
Foo for First derived class
Foo for Second derived class
Foo for First derived class
Foo for Second derived class

In main(), the vector can store pointers for BassClass or child of BaseClass. After two push_back(), the vector holds the pointers for two instances, DerivedClassFirst and DerivedClassSecond. Then, at the first for loop, the instances are copied by clone().

One of refactoring rules is "Replace type code with polymorphism". Prototype pattern is a good solution for the refactoring like the code 1.

Summary

  • Replace type code with polymorphism
  • Prototype pattern is to copy the prototype instance with using polymorphism.
Name

0 weights,1,abstract class,1,active function,3,adam,2,Adapter,1,affine,2,argmax,1,back propagation,3,binary classification,3,blog,2,Bucket list,1,C++,11,Casting,1,cee,1,checkButton,1,cnn,3,col2im,1,columnspan,1,comboBox,1,concrete class,1,convolution,2,cost function,6,data preprocessing,2,data set,1,deep learning,31,Design Pattern,12,DIP,1,django,1,dnn,2,Don't Repeat Your code,1,drop out,2,ensemble,2,epoch,2,favicon,1,fcn,1,frame,1,gradient descent,5,gru,1,he,1,identify function,1,im2col,1,initialization,1,Lab,9,learning rate,2,LifeLog,1,linear regression,6,logistic function,1,logistic regression,3,logit,3,LSP,1,lstm,1,machine learning,31,matplotlib,1,menu,1,message box,1,mnist,3,mse,1,multinomial classification,3,mutli layer neural network,1,Non Virtual Interface,1,normalization,2,Note,21,numpy,4,one-hot encoding,3,OOP Principles,2,Open Close Principle,1,optimization,1,overfitting,1,padding,2,partial derivative,2,pooling,2,Prototype,1,pure virtual function,1,queue runner,1,radioButton,1,RBM,1,regularization,1,relu,2,reshape,1,restricted boltzmann machine,1,rnn,2,scrolledText,1,sigmoid,2,sigmoid function,1,single layer neural network,1,softmax,6,softmax classification,3,softmax cross entropy with logits,1,softmax function,2,softmax regression,3,softmax-with-loss,2,spinBox,1,SRP,1,standardization,1,sticky,1,stride,1,tab,1,Template Method,1,TensorFlow,31,testing data,1,this,2,tkinter,5,tooltip,1,Toplevel,1,training data,1,vanishing gradient,1,Virtual Copy Constructor,1,Virtual Destructor,1,Virtual Function,1,weight decay,1,xavier,2,xor,3,
ltr
item
Universe In Computer: 07. Prototype Pattern
07. Prototype Pattern
Prototype pattern implementation
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXvUavVsX4rYm8cgKQ8rzps7pHmmEVtkIb66G2o5KZFCfjvO96SCEUdaw_DMYzSbdVrB8XvnaKN8ljEE7EBjutI2XvsBL-2BLdijjJRIpAOEpvlhOW-hfWP3ir3wbE488AwdFEu7WKbLgO/s0/
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXvUavVsX4rYm8cgKQ8rzps7pHmmEVtkIb66G2o5KZFCfjvO96SCEUdaw_DMYzSbdVrB8XvnaKN8ljEE7EBjutI2XvsBL-2BLdijjJRIpAOEpvlhOW-hfWP3ir3wbE488AwdFEu7WKbLgO/s72-c/
Universe In Computer
https://kunicom.blogspot.com/2018/02/07-prototype-pattern.html
https://kunicom.blogspot.com/
https://kunicom.blogspot.com/
https://kunicom.blogspot.com/2018/02/07-prototype-pattern.html
true
2543631451419919204
UTF-8
Loaded All Posts Not found any posts VIEW ALL Readmore Reply Cancel reply Delete By Home PAGES POSTS View All RECOMMENDED FOR YOU LABEL ARCHIVE SEARCH ALL POSTS Not found any post match with your request Back Home Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sun Mon Tue Wed Thu Fri Sat January February March April May June July August September October November December Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec just now 1 minute ago 1 minutes ago 1 hour ago 1 hours ago Yesterday 1 days ago 1 weeks ago more than 5 weeks ago Followers Follow THIS CONTENT IS PREMIUM Please share to unlock Copy All Code Select All Code All codes were copied to your clipboard Can not copy the codes / texts, please press [CTRL]+[C] (or CMD+C with Mac) to copy