抽象原型 Prototype.h  &  Prototype.cpp


//
//  Prototype.h
//  Prototype
//
//  Created by hejinlai on 13-8-9.
//  Copyright (c) 2013年 yunzhisheng. All rights reserved.
//
#ifndef __Prototype__Prototype__
#define __Prototype__Prototype__
#include <iostream>
using namespace std;
class Prototype {
                                   
public:
                                   
    Prototype();
    virtual ~Prototype();
                                   
    virtual Prototype * clone() = 0;
                                   
    string getName();
    void setName(string name);
                                   
protected:
                                   
    string name;
};
#endif /* defined(__Prototype__Prototype__) */


//
//  Prototype.cpp
//  Prototype
//
//  Created by hejinlai on 13-8-9.
//  Copyright (c) 2013年 yunzhisheng. All rights reserved.
//
#include "Prototype.h"
Prototype::Prototype()
{
                                
}
Prototype::~Prototype()
{
                                
}
string Prototype::getName()
{
    return name;
}
void Prototype::setName(string name)
{
    this->name = name;
}


具体原型 ConcretePrototype.h  &  ConcretePrototype.cpp


//
//  ConcretePrototype.h
//  Prototype
//
//  Created by hejinlai on 13-8-9.
//  Copyright (c) 2013年 yunzhisheng. All rights reserved.
//
#ifndef __Prototype__ConcretePrototype__
#define __Prototype__ConcretePrototype__
#include <iostream>
#include "Prototype.h"
using namespace std;
class ConcretePrototype : public Prototype{
                    
public:
                    
    ConcretePrototype();
    ConcretePrototype(const ConcretePrototype & p);
    ~ConcretePrototype();
                    
    virtual Prototype * clone();
                    
};
#endif /* defined(__Prototype__ConcretePrototype__) */


//
//  ConcretePrototype.cpp
//  Prototype
//
//  Created by hejinlai on 13-8-9.
//  Copyright (c) 2013年 yunzhisheng. All rights reserved.
//
#include "ConcretePrototype.h"
ConcretePrototype::ConcretePrototype()
{
                 
}
ConcretePrototype::~ConcretePrototype()
{
                 
}
ConcretePrototype::ConcretePrototype(const ConcretePrototype & p)
{
    this->name = p.name;
}
Prototype * ConcretePrototype::clone()
{
    return new ConcretePrototype(*this);
}


测试 main.cpp


//
//  main.cpp
//  Prototype
//
//  Created by hejinlai on 13-8-9.
//  Copyright (c) 2013年 yunzhisheng. All rights reserved.
//
#include <iostream>
#include "ConcretePrototype.h"
int main(int argc, const char * argv[])
{
    Prototype *p = new ConcretePrototype();
    p->setName("zhangsan");
    cout << p->getName() << endl;
            
    Prototype *p2 = p->clone();
    cout << p2->getName() << endl;
            
    delete p;
    delete p2;
            
    return 0;
}



测试结果:


zhangsan

zhangsan