[设计模式C++go]创建型模式:原型模式

Posted 凌星An

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[设计模式C++go]创建型模式:原型模式相关的知识,希望对你有一定的参考价值。

原型模式

介绍

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式

其定义为:
Specify the kinds of objects to create using a prototypical instance,andcreate new objects by copying this prototype.(用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。)

意图: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
主要解决:在运行期建立和删除原型。

何时使用: 1、当一个系统应该独立于它的产品创建,构成和表示时。 2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。 3、为了避免创建一个与产品类层次平行的工厂类层次时。 4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
关键代码: 实现克隆操作接口
2、原型模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些"易变类"拥有稳定的接口。

类图


Prototype: 声明一个克隆自身的接口,用来约束想要克隆自己的类,要求它们都要实现这里定义的克隆方法

ConcretePrototype :实现Prototype接口的类,这些类真正实现了克隆自身的功能

Client : 使用原型的客户端,首先要获取到原型实力对象,然后通过原型实例克隆自身来创建新的对象实例

代码实现

倘若我们使用代码表示一份简历、设计的内容仅限于(姓名,联系电话,工作经历即时间+公司 ) ,而简历我们不可能只要一份,因此需要克隆多份,即使用原型模式

C++

#include<iostream>
#include<string>
#include<cstring>

class Prototype
public:
	virtual Prototype* Clone() = 0;
;

class Resume:public Prototype
public:
	void SetResume(std::string name,std::string phoneNum,std::string time,std::string Company)
		_name = name;
		_phoneNum = phoneNum;
		_time = time;
		_Company = Company;
	
	void SetWorkExp(std::string time, std::string Company)
		_time = time;
		_Company = Company;
	
	Prototype* Clone()
		
		Resume* r = (Resume*)malloc(sizeof(Resume));
		memcpy(r, this, sizeof(Resume));
		
		return r;
	
	void DisplayResume()
		std::cout << _name << "  " << _phoneNum << "   " << _time << "  " << _Company << std::endl;
	
private:
	std::string _name;
	std::string _phoneNum;
	std::string _time;
	std::string _Company;
;

测试

void Prototype_test()
	Resume re;
	re.SetResume("李", "12345678901", "2020-2021", "xx公司");
	
	Resume* re1 = (Resume*)re.Clone();
	re.DisplayResume();
	re1->DisplayResume();
	re1->SetWorkExp("2021-2022", "yy公司");
	re.DisplayResume();
	re1->DisplayResume();

结果:

李 12345678901 2020-2021 xx公司
李 12345678901 2020-2021 xx公司
李 12345678901 2020-2021 xx公司
李 12345678901 2021-2022 yy公司

go

package Prototype

import "fmt"


type Prototype interface
     Clone() Prototype


type Resume struct
     _name string
     _phoneNum string
     _time string
     _Company string


func (r *Resume)Clone()Prototype
      return &Resume
          _name:r._name,
          _phoneNum:r._phoneNum,
          _time:r._time,
          _Company:r._Company,
      

func (r *Resume)SetResume(name,phoneNum,time,Company string)
      r._name=name
      r._phoneNum=phoneNum
      r._time=time
      r._Company=Company

func (r *Resume)SetWorkExp(time,Company string)
      r._time=time
      r._Company=Company 

func (r *Resume)DisplayResume()
      fmt.Println("name:",r._name," phoneNum:",r._phoneNum," time:",r._time," Company:",r._Company)


测试

package main

import (
  p "Prototype"
)
func main()
     re:=p.Resume
     re.SetResume("李","12345678901","2020-2021","xx公司")
     
     pro := re.Clone()
     if re1,ok:=pro.(*p.Resume);ok
       re.DisplayResume()
       re1.DisplayResume()
       re1.SetWorkExp("2021-2022","yy公司")
       re.DisplayResume()
       re1.DisplayResume()
      
     
  


结果:

name: 李 phoneNum: 12345678901 time: 2020-2021 Company: xx公司
name: 李 phoneNum: 12345678901 time: 2020-2021 Company: xx公司
name: 李 phoneNum: 12345678901 time: 2020-2021 Company: xx公司
name: 李 phoneNum: 12345678901 time: 2021-2022 Company: yy公司

优缺点

优点:
1、性能提高。
原型模式是在内存二进制流的拷贝,要比直接new一个对象性能要好很多
2、逃避构造函数的约束。
直接在内存中拷贝,构造函数是不会执行的.
缺点:
1、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。 2、必须实现 Cloneable 接口。

使用场景:

1、资源优化场景。
类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。
3、性能和安全要求的场景。
通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
5、一个对象多个修改者的场景。
一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。

注意事项: 与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。

以上是关于[设计模式C++go]创建型模式:原型模式的主要内容,如果未能解决你的问题,请参考以下文章

[设计模式C++go]创建型模式:原型模式

go设计模式之原型模式

[设计模式C++go]创建型模式:单例模式

[设计模式C++go]创建型模式:建造者模式

[设计模式C++go]创建型模式:建造者模式

[设计模式C++go]创建型模式:建造者模式