原型模式
2020 年 09 月 04 日 209 380 字 暂无评论

01.概念

  • Prototype模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例。使用Prototype模式创建的实例,具有与原型一样的数据。

    • 由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身。
    • 目标对象是原型对象的一个克隆。也就是说,通过Prototype模式创建的对象,不仅仅与原型对象具有相同的结构,还与原型对象具有相同的值。
    • 根据对象克隆深度层次的不同,有浅度克隆与深度克隆。
  • 原型模式主要面对的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。
  • 适用情况:

    • 一个复杂对象,具有自我复制功能,统一一套接口。

02.结构图

  • 客户(Client)角色:客户类提出创建对象的请求。
  • 抽象原型(Prototype)角色:这是一个抽象角色,通常由一个C#接口或抽象类实现。此角色给出所有的具体原型类所需的接口。在C#中,抽象原型角色通常实现了ICloneable接口。
  • 具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象原型角色所要求的接口。

03.代码案例

#include <iostream>

using namespace std;

class Person
{
public:
        virtual Person* Clone() = 0;
        virtual void printT() = 0;

private:
};

class JavaProgrammer:public Person
{
public:
        JavaProgrammer()
        {
                this->m_name = "";
                this->m_age = 0;
                m_resume = NULL;
        }
        JavaProgrammer(string name, int age)
        {
                this->m_name = name;
                this->m_age = age;
                m_resume = NULL;
        }

        ~JavaProgrammer()
        {
                if (m_resume != NULL)
                {
                        /*free(m_resume);*/
                        m_resume = NULL;
                }
        }
        virtual Person* Clone()
        {
                JavaProgrammer* p = new JavaProgrammer;
                *p = *this;
                return p;
        }
        void setResume(const char* resume)
        {
                m_resume = new char[strlen(resume) + 1];
                
                m_resume = resume;
                //strcpy(m_resume, resume);
        }
        virtual void printT()
        {
                cout << "m_name:" << m_name << "\t" << "m_age:" << m_age << endl;
                if (m_resume != NULL)
                {
                        cout << m_resume << endl;
                }
        }

private:
        string m_name;
        int m_age;
        const char* m_resume;
};

void main()
{
        JavaProgrammer javaperson1("小明", 25);
        char str[] = "我是java程序员";
        javaperson1.setResume(str);
        Person* p2 = javaperson1.Clone();
        p2->printT();

        delete p2;
}
  • 输出
m_name:小明     m_age:25
我是java程序员

版权属于:zfh

本文链接:http://zfhblog.com/index.php/archives/136/



评论已关闭