设计模式--原型模式(Prototype)

本文详细介绍了原型模式的概念及其在C++和Java中的实现方式。通过示例代码解释了如何使用拷贝构造函数和clone方法来创建对象副本。探讨了原型模式的优点及适用场景,并对比了浅拷贝与深拷贝的区别。

Prototype

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。提供了一个通过已存在对象进行新对象创建的接口,在C++中使用拷贝构造函数。
 
Java中通过覆盖父类Object的clone方法实现,继承接口Cloneable,此接口无任何方法,只起一个标记作用, 具有这个标记的对象才有可能被拷贝。

Public class PrototypeClass implements Cloneable
{
Public PrototypeClass clone()
{
        PrototypeClass prototypeClass = null;
        Try
{
        prototypeClass = (PrototypeClass)super.clone();
}
Catch (CloneNotSupportedException e)
{
}
return prototypeClass;
}
优点:
1、      性能优良:内存二进制流的拷贝,比直接new一个对象性能好,特别是在一个循环体内产生大量的对象时。
2、      逃避了构造函数的约束:直接内存拷贝,构造函数不执行。
使用场景:
1、      资源优化场景:类初始化需要非常多的资源
2、      性能和安全要求的场景:new需要非常频繁的数据准备和访问权限
3、      一个对象对个修改者得场景:拷贝多个对象供使用者修改

注意:浅拷贝和深拷贝
CWinApp theApp;

using namespace std;

class Prototype
{
public:
        virtual ~Prototype(); 
        virtual Prototype* Clone() const = 0; //纯虚函数,抽象类
protected:
        Prototype();
private:
};

Prototype::Prototype()
{
}
Prototype::~Prototype()
{
}
Prototype* Prototype::Clone() const
{
        return 0;
}

class ConcretePrototype:public Prototype
{
public:
        ConcretePrototype(int num, char * name);
        ConcretePrototype(const ConcretePrototype& cp);
        ~ConcretePrototype();
    Prototype* Clone() const;

protected:
private:
        int Num;
        char *pname;
};

ConcretePrototype::ConcretePrototype(int num, char*name)
{
        int length=strlen(name);
    pname=new char[length+1];
    if(pname!=0)
        strcpy(pname,name);
    Num = num;
    cout<<"构造函数执行"<<pname<<endl;

}

ConcretePrototype::~ConcretePrototype()
{
}

//拷贝构造函数
ConcretePrototype::ConcretePrototype(const ConcretePrototype& cp)
{
        cout<<"拷贝构造函数执行 ..."<<endl;
        Num = cp.Num;
        int len = strlen(cp.pname);
        pname = new char[len+1];
    if(pname!=0)
        {
        strcpy(pname,cp.pname);
        }
        cout<<Num<<endl;
        cout<<pname<<endl;
}

Prototype* ConcretePrototype::Clone() const
{
        return new ConcretePrototype(*this);
} 

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
        int nRetCode = 0;

        // initialize MFC and print and error on failure
        if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
        {
                // TODO: change error code to suit your needs
                cerr << _T("Fatal Error: MFC initialization failed") << endl;
                nRetCode = 1;
        }
        else
        {
                // TODO: code your application's behavior here.

                //Prototype     q;
                Prototype* p = new ConcretePrototype(1,"zhaohailiang");
        Prototype* p1 = p->Clone();

                delete p;

                CString strHello;
                strHello.LoadString(IDS_HELLO);
                cout << (LPCTSTR)strHello << endl;

                char b;
                cin >> b;
        }

        return nRetCode;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值