`

[创建型模式] 原型模式的理解

 
阅读更多




头文件
//PrototypePattern.h

#ifndef PROTOTYPE_PATTERN_H
#define PROTOTYPE_PATTERN_H

#include <Windows.h>
#include <string>
using namespace std;

namespace PrototypePattern
{
    // Base Class
    //////////////////////////////////////////////////////////////////////////
    class AbstractPrototype
    {
    public:
        AbstractPrototype();
        virtual ~AbstractPrototype();

        virtual AbstractPrototype* Clone() = 0;
    };


    //////////////////////////////////////////////////////////////////////////
    class ConcretePrototypeA : public AbstractPrototype
    {
    public:
        ConcretePrototypeA(string strName, int nId);
        ConcretePrototypeA(ConcretePrototypeA* pPrototypeA);
        virtual ~ConcretePrototypeA();

        virtual AbstractPrototype* Clone();

    private:
        string m_strName;
        int m_nID;
    };

    //////////////////////////////////////////////////////////////////////////
    class ConcretePrototypeB : public AbstractPrototype
    {
    public:
        ConcretePrototypeB(string strName, int nId);
        ConcretePrototypeB(ConcretePrototypeB* pPrototypeA);
        virtual ~ConcretePrototypeB();

        virtual AbstractPrototype* Clone();

    private:
        string m_strName;
        int m_nID;
    };

    //////////////////////////////////////////////////////////////////////////
    void PrototypePattern_Test_A();
    void PrototypePattern_Test_B();

}

#endif

实现
#include "PrototypePattern.h"
#include <iostream>
using namespace std;

namespace PrototypePattern
{

    //////////////////////////////////////////////////////////////////////////
    AbstractPrototype::AbstractPrototype()
    {
    }
    AbstractPrototype::~AbstractPrototype()
    {
    }

    //////////////////////////////////////////////////////////////////////////
    ConcretePrototypeA::ConcretePrototypeA(string strName, int nId)
    {
        m_strName = strName;
        m_nID = nId;
    }

    ConcretePrototypeA::ConcretePrototypeA(ConcretePrototypeA* pPrototypeA)
    {
        this->m_strName = pPrototypeA->m_strName;
        this->m_nID = pPrototypeA->m_nID;
    }
    ConcretePrototypeA::~ConcretePrototypeA()
    {
    }

    AbstractPrototype* ConcretePrototypeA::Clone()
    {
        cout << "ConcretePrototypeA::Clone\n";
        cout << "m_strName=" << m_strName << "; m_nID =" << m_nID << ";\n";

        return new ConcretePrototypeA(this);
    }


    //////////////////////////////////////////////////////////////////////////
    ConcretePrototypeB::ConcretePrototypeB(string strName, int nId)
    {
        m_strName = strName;
        m_nID = nId;
    }

    ConcretePrototypeB::ConcretePrototypeB(ConcretePrototypeB* pPrototypeA)
    {
        this->m_strName = pPrototypeA->m_strName;
        this->m_nID = pPrototypeA->m_nID;
    }
    ConcretePrototypeB::~ConcretePrototypeB()
    {
    }

    AbstractPrototype* ConcretePrototypeB::Clone()
    {
        cout << "ConcretePrototypeB::Clone\n";
        cout << "m_strName=" << m_strName << "; m_nID =" << m_nID << ";\n";

        return new ConcretePrototypeB(this);
    }

    //////////////////////////////////////////////////////////////////////////
    void PrototypePattern_Test_A()
    {
        AbstractPrototype* pPrototype1 = new ConcretePrototypeA("ConcretePrototypeA", 1);
        AbstractPrototype* pPrototype2 = pPrototype1->Clone();
        AbstractPrototype* pPrototype3 = pPrototype2->Clone();


        delete pPrototype3;
        pPrototype3 = NULL;

        delete pPrototype2;
        pPrototype2 = NULL;

        delete pPrototype1;
        pPrototype1 = NULL;
    }

    void PrototypePattern_Test_B()
    {
        AbstractPrototype* pPrototype1 = new ConcretePrototypeA("ConcretePrototypeB", 2);
        AbstractPrototype* pPrototype2 = pPrototype1->Clone();
        AbstractPrototype* pPrototype3 = pPrototype2->Clone();


        delete pPrototype3;
        pPrototype3 = NULL;

        delete pPrototype2;
        pPrototype2 = NULL;

        delete pPrototype1;
        pPrototype1 = NULL;
    }
}

客户端
#include "PrototypePattern.h"

#include <iostream>
using namespace std;
using namespace PrototypePattern;

void main()
{
    PrototypePattern_Test_A();
    PrototypePattern_Test_B();
}

运行结果








结构类图


用例模型




设计类图


顺序图
分享到:
评论

相关推荐

    设计模式之创建型模式实验.docx

    【设计模式之创建型模式实验】 创建型设计模式主要关注对象的创建,它们提供了一种在不指定具体类的情况下创建对象的方式,增强了系统的灵活性和可扩展性。在本实验中,我们将探讨五种常见的创建型设计模式:简单...

    23种设计模式,创建型模式共5种,结构型模式7种,行为型模式11种

    设计模式分为三大类:创建型模式、结构型模式和行为型模式。 **创建型模式**关注的是对象的创建。共有五种创建型模式: 1. **工厂方法模式**:它定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法...

    C#面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式)

    本篇文章将深入探讨C#中的“原型模式”(Prototype Pattern),这是一种创建型设计模式,它允许我们通过复制已有对象来创建新对象,而不是从零开始创建。 原型模式的核心思想是克隆。在C#中,对象的克隆可以通过...

    C#面向对象设计模式纵横谈-创建型模式

    本文将深入探讨C#中的创建型模式,帮助开发者更好地理解和应用这些模式。 1. **单例模式(Singleton)** 单例模式确保一个类只有一个实例,并提供全局访问点。在C#中,我们通常通过私有构造函数和静态方法来实现...

    设计模式之创建型模式.pdf

    创建型模式包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式等。这些模式各有其特定的应用场景和优势。 首先,单例模式是一种常见的创建型模式,它保证一个类只有一个实例,并提供一个全局访问点。...

    Java设计模式之创建型模式源码以及文档

    本篇主要聚焦于创建型模式,这是一种用来处理对象创建的技术,通过封装、抽象和多态来提供更灵活的实例化过程。 创建型模式包括五种主要类型:单例(Singleton)、工厂方法(Factory Method)、抽象工厂(Abstract ...

    C#视频-面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式)

    在本课程中,我们将深入探讨C#编程中的一个重要设计模式——Prototype原型模式,它是创建型设计模式的一种。原型模式主要用于简化实例化过程,通过复制已有对象来创建新对象,而不是直接通过构造函数来创建。这一...

    行为型模式+结构型模式+创建型模式:三大设计模式实例剖析与深入解读

    创建型模式包括工厂模式、抽象工厂模式、单例模式、建造者模式和原型模式。这些模式有助于解耦代码,使得系统更易于维护和扩展。 例如,**工厂模式**是一种简单的方式,通过定义一个公共接口来创建对象,而具体的...

    设计模式——原型模式

    原型模式(Prototype Pattern)是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而无需知道具体创建过程的细节。这种模式的核心在于,它提供了一种对象克隆的简便方法,使得对象的创建过程对用户...

    android设计模式之原型模式

    原型模式是一种创建型设计模式,它的主要思想是通过复制已有对象来创建新对象,而不是通过构造函数来创建。这种模式可以有效地减少对象创建时的开销,尤其是在需要创建大量相似对象的情况下。在Android中,原型模式...

    原型模式PPT文档

    原型模式是一种创建型设计模式,它允许我们创建对象的克隆,而无需知道具体的实现细节。在软件工程中,当我们需要创建多个相似的对象时,使用原型模式可以大大提高效率,避免了每次都去创建新的对象。这种模式是基于...

    设计模式原理与应用之创建型模式.pptx

    创建型模式是设计模式中的一个重要类别,它关注于对象的创建过程,帮助开发者封装创建细节,使系统独立于具体对象的创建方式。 1. **Singleton(单例模式)** 单例模式确保一个类只有一个实例,并提供全局访问点...

    创建型模式(除singleton)外的四种模式简单实例

    创建型设计模式是软件设计模式中的重要类别,主要用于对象的创建。它们提供了一种封装对象创建过程的方法,使得代码更加灵活、易于维护,并且能够更好...理解并熟练运用这些创建型模式,对提升软件设计的质量至关重要。

    白话讲解创建型设计模式:单例原型构建

    本文将聚焦于创建型设计模式,特别是单例模式和原型模式,这两种模式在对象的创建方面扮演着重要的角色。 单例模式是一种限制类实例化次数的设计模式,确保在整个应用程序中,一个类只有一个实例存在。这在某些场景...

    创建型模式uml类图EA文件.rar

    本压缩包文件包含了五个关于创建型模式的UML类图,通过Enterprise Architect(EA)软件进行建模,便于理解和实现。以下是这些模式的详细说明: 1. **工厂方法模式** - `工厂模式 计算器.EAP` 工厂方法模式是创建型...

    设计模式之“创建型模式”经典代码

    创建型模式是设计模式的一种,主要关注对象的创建过程,帮助我们在不同场景下以灵活、抽象的方式创建对象,提高代码的复用性和可读性。以下是对几种创建型模式的详细解释: 1. **抽象工厂(Abstract Factory)** ...

Global site tag (gtag.js) - Google Analytics