• 原型模式及C++实现


    以下是我自己学习设计模式的感想。

    原型模式

    学过C++的都知道拷贝构造函数,复制一个对象分为浅拷贝和深拷贝。

    浅拷贝:就是给对象中的每个成员变量进行复制,就是把A1类中的变量直接赋给A2类中变量,属于值传递,但是涉及到有new之类内存分配的地方,他们却是共享内存的。

    深拷贝:就是不仅使用值传递,而是要每个变量都有自己一份独立的内存空间,互不干扰。

    默认的拷贝构造函数是浅拷贝的,如果要实现深拷贝,就需要重写拷贝构造函数T(const T&)。

    既然有了拷贝构造函数,还要引入原型模式呢?根据我自己查阅资料之后,我觉得好像是面向对象语言中都是引用传递,而且只提供简单的浅拷贝,所以没有拷贝构造函数这么一说,于是要实现深拷贝的功能,就需要原型模式。不知道这个想法对不对,欢迎指正。

    image

    常用场景

    基本就是你需要从A的实例得到一份与A内容相同,但是又互不干扰的实例的话,就需要使用原型模式。

    优点

    1.使用拷贝模式比直接new一个对象的开销要小的多。

    2.可以在程序运行时(对象属性发生了变化),得到一份内容相同的实例,但之间还不会相互干扰。

    缺点

    C++实现

    #ifndef _PROTOTYPE_H_
    #define _PROTOTYPE_H_
    
    
    class Prototype{
    
    public:
    	Prototype();
    	virtual ~Prototype();
    
    	virtual Prototype* clone() = 0;
    };
    
    
    class ConcretePrototype:public Prototype{
    
    public:
    	ConcretePrototype();
    	~ConcretePrototype();
    
    	Prototype* clone();
    
    private:
    	ConcretePrototype(const ConcretePrototype&);
    };
    
    #endif
    #include "Prototype.h"
    #include <stdio.h>
    
    
    Prototype::Prototype()
    {
    
    }
    
    
    Prototype::~Prototype()
    {
    
    }
    
    
    ConcretePrototype::ConcretePrototype()
    {
    
    }
    
    
    ConcretePrototype::~ConcretePrototype()
    {
    
    }
    
    
    ConcretePrototype::ConcretePrototype(const ConcretePrototype& c)
    {
    	fprintf(stderr,"ConcretePrototype copy construct!
    ");
    }
    
    
    Prototype* ConcretePrototype::clone()
    {
    	return new ConcretePrototype(*this);
    }
    #include "Prototype.h"
    
    
    int main()
    {
    	Prototype* p = new ConcretePrototype();
    
    	Prototype* a = p->clone();
    	return 0;
    }
    g++ -o client client.cpp Prototype.cpp

    运行的结果

    image

  • 相关阅读:
    php 原生 好久不写原生demo了
    鸡汤
    php 发送smtp邮件
    php微信支付代码
    3、Flume
    P2761 软件补丁问题
    TQL
    二分图匹配
    p2597 灾难
    P3958 奶酪
  • 原文地址:https://www.cnblogs.com/cxjchen/p/3151496.html
Copyright © 2020-2023  润新知