示例问题:
实现一个类的时候,通常会重载运算符“=”,然后可以将同一个类的对象用“=”赋值给另外一个对象。这实际上这就是原型模式的一种应用了(原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。)下面就阐述下重载运算符“=”(使用原型模式)带来的好处。
未重载运算符“=”(未使用原型模式):
UnProtoType.h
#pragma once
#include <string>
#include <iostream>
class CPerson
{
public:
CPerson()
{
}
virtual ~ CPerson()
{
}
void SetName(std::string strName)
{
m_strName = strName;
}
void SetAge(int iAge)
{
m_iAge = iAge;
}
void Show()
{
std::cout << "姓名 : " << m_strName << std::endl;
std::cout << "年龄 : " << m_iAge << std::endl;
std::cout << std::endl;
}
private:
std::string m_strName;
int m_iAge;
};
main.cpp
// main.cpp : Defines the entry point for the console application.
//
#include "ProtoType.h"
int main()
{
CPerson Person1;
Person1.SetName("张三");
Person1.SetAge(12);
Person1.Show();
CPerson Person2;
Person2.SetName("张三");
Person2.SetAge(12);
Person2.Show();
system("pause");
return 0;
}
运行结果
通过这种方式要产生多个“张三”,则需要创建多个人的对象并分别给这个人赋值姓名和年龄,如果需要修改张三的年龄,则需要修改多处。
重载运算符“=”(使用原型模式):
ProtoType.h
#pragma once
#include <string>
#include <iostream>
class CPerson
{
public:
CPerson()
{
}
virtual ~ CPerson()
{
}
CPerson& operator= (const CPerson& Other)
{
if (this == &Other)
{
return *this;
}
m_strName = Other.m_strName;
m_iAge = Other.m_iAge;
return *this;
}
void SetName(std::string strName)
{
m_strName = strName;
}
void SetAge(int iAge)
{
m_iAge = iAge;
}
void Show()
{
std::cout << "姓名 : " << m_strName << std::endl;
std::cout << "年龄 : " << m_iAge << std::endl;
std::cout << std::endl;
}
private:
std::string m_strName;
int m_iAge;
};
main.cpp
// main.cpp : Defines the entry point for the console application.
//
#include "ProtoType.h"
int main()
{
CPerson Person1;
Person1.SetName("张三");
Person1.SetAge(12);
Person1.Show();
CPerson Person2 = Person1;;
Person2.Show();
system("pause");
return 0;
}
运行结果:
由于重载了运算符“=”,可以用赋值的方式,将对象赋值给另外一个对象。这样当存在多个“张三”时,如果需要修改张三的年龄,则只需修改Person1的年龄即可。
原型模式的使用:
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式其实就是从一个对象再创建另外一个对象,而且需要知道任何创建的细节。
当一个类的实例只能有几个不同状态组合中的一种,且需要多个同样的对象时,通过克隆比每次用合适的状态手工实例化该类更方便,更不易出错。
何时使用原型模式:
1. 当一个类的实例只能有几个不同状态组合中的一种,且需要多个同样的对象时。
2. 当一个系统应该独立于他的产品创建、构成和表示时,需要使用原型模式。
返回目录:设计模式(C++实现)(总)