栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > C/C++/C#

[设计模式][C++] 原型模式

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[设计模式][C++] 原型模式

原型模式

文章目录
  • 原型模式
    • 介绍
      • 意图和动机
      • 参与者
    • UML图
    • 模式解析
      • 适用性
      • 效果
    • 代码示例

介绍 意图和动机

原型模式的意图在于用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其实就是从一个对象再创建另外一个可以定制的对象,并且不需要知道任何创建的细节。

参与者
  • Prototype:声明一个克隆自身的接口
  • ConcreteProtorype:实现一个克隆自身的操作
  • Client:让一个原型克隆自身
UML图

模式解析 适用性

当下列情况可以使用原型模式:

  • 当一个系统应该独立于它的产品创建、构成和表示时
  • 当要实例化的类实在运行时指定时
  • 为了避免创建一个与产品类层次平行的工厂类层次时
  • 当一个类的实例只能由几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一下
效果

下面时原型模式的一些优点:

  • 可以在运行时增加和删除产品
  • 可以改变值以指定新对象
  • 改变结构以指定新对象
  • 减少子类的构造
  • 用类动态配置应用
代码示例

以复制简历为例,其中IResume是接口类,声明了简历类的接口,包括show和clone。原型模式在C++的应用中主要涉及的是类的拷贝构造函数和clone函数


#include
#include
#include
#include

using namespace std;

class IResume
{
	public:
		virtual IResume* clone() const = 0;
		virtual void show() {};

	protected:
		char*	name;
		uint8_t age = 0;
		uint8_t sex = 0;
};

class Resume : public IResume
{
public:
	// 构造函数
	Resume() { name = const_cast("No name"); }

	Resume(const char* str, uint8_t age, uint8_t sex)
		:age(age), sex(sex)
	{
		if (str == nullptr)
		{
			name = const_cast("No name");
		}
		else
		{
			name = new char[strlen(str) + 1];
			strcpy_s(this->name, strlen(str)+1, str);
		}
	}

	// 拷贝构造函数,因为不应该拥有拷贝的对象的操作权,所以这里要用const
	Resume(const Resume& re)
	{
		int str_len = strlen(re.name);

		name = new char[str_len + 1];
		strcpy_s(name, str_len+1, re.name); //选用深拷贝

		age = re.age;
		sex = re.sex;
	}

	Resume* clone() const
	{
		
		return new Resume(*this);
	}

	void show()
	{
		
		cout << setfill('=') << setw(20);
		cout << "简历打印";
		cout << setfill('=') << setw(16) << " " << endl;
		cout << "名字" << name << setw(10) << setfill(' ') << "年龄" << to_string(age)
			<上一篇  java编译方法参数(-parameters)名为arg0问题
 

下一篇 linux无网络环境中python的pip安装

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号