Charpter09 原型模式

原型模式简介

原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

原型模式其实就是从一个对象再创建另外一个可定制的对象,并且不需知道任何创建的细节。

一般在初始化信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象的细节,有对性能是大大的提高。它等于是不用重新初始化对象,而是动态地获得对象运行时的状态。

所谓原型模式,其实就是在父类中定义一个clone的抽象方法,其目的是让子类来具体实现这个clone方法,此clone方法内实现对象创建以及字段的复制。注意只是类内字段复制,也就是浅copy。

所谓浅copy就是被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。而深copy则把引用的对象也copy了一份。

原型模式UML类图

// 原型的接口类 Prototype
#ifndef _PROTOTYPE_HPP
#define _PROTOTYPE_HPP

class Prototype{
    public:
    virtual Prototype* clone()= 0;
    virtual void printVal() = 0;
};

#endif
// 抽象接口的实现类ConcretePrototype1
#ifndef _CONCRETEPROTOTYPE1_HPP
#define _CONCRETEPROTOTYPE1_HPP
#include<iostream>
#include<string>
#include"prototype.hpp"
using namespace std;

class ConcretePrototype1:public Prototype{
public:
    ConcretePrototype1()=default;
    ConcretePrototype1(double a, int b):a(a),b(b){}

    virtual Prototype* clone()override{
        ConcretePrototype1* clonedOne = new ConcretePrototype1();
        clonedOne->a = this->a;
        clonedOne->b = this->b;
        return (Prototype*)clonedOne;
    } 
    virtual void printVal()override{
        cout << "a:"<<a << endl;
        cout << "b:"<< b << endl;
    }
    void setA(double a){
        this->a = a;
    }
    void setB(int b){
        this->b = b;
    }
private:
    double a;
    int b; 
};
#endif
// 抽象接口的实现类ConcretePrototype2
#ifndef _CONCRETEPROTOTYPE2_HPP
#define _CONCRETEPROTOTYPE2_HPP
#include<iostream>
#include<string>
#include"prototype.hpp"
using namespace std;

class ConcretePrototype2:public Prototype{
public:
    ConcretePrototype2()=default;
    ConcretePrototype2(string str,double a):str(str),a(a){}
    virtual Prototype* clone()override{
        ConcretePrototype2* clonedOne = new ConcretePrototype2();
        clonedOne->str = this->str;
        clonedOne->a = this->a;
        return (Prototype*)clonedOne;
    } 
    virtual void printVal()override{
        cout << "str:"<<str<< endl;
        cout << "a:"<< a << endl;
    } 
    void setStr(string str){
        this->str = str;
    }
    void setA(double a){
        this->a = a;
    }
private:
    string str;
    double a; 
};
#endif
//客户端代码
#include<iostream>
#include"concreteprototype1.hpp"
#include"concreteprototype2.hpp"
using namespace std;
int main(){
    ConcretePrototype1 cp1(1,2);
    ConcretePrototype1* cp1Clone = (ConcretePrototype1*)cp1.clone();
    cp1.printVal();
    cp1Clone->printVal();

    ConcretePrototype2 cp2("aaa",3);
    ConcretePrototype2* cp2Clone =(ConcretePrototype2*)cp2.clone();
    cp2.printVal();
    cp2Clone->printVal();

    getchar();
    return 0;
}

 

猜你喜欢

转载自www.cnblogs.com/yb-blogs/p/12516629.html