千家信息网

在C++和Java中如何实现原型模式

发表于:2024-11-24 作者:千家信息网编辑
千家信息网最后更新 2024年11月24日,这篇文章主要介绍了在C++和Java中如何实现原型模式 ,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。GOF 给原型模式 的定义为:用
千家信息网最后更新 2024年11月24日在C++和Java中如何实现原型模式

这篇文章主要介绍了在C++和Java中如何实现原型模式 ,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

GOF 给原型模式 的定义为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

在 C++和Java 中都提供了clone()方法来实现对象的克隆,但是在Java中必须要实现Cloneable这个接口。

通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。

一、组成:

1) 客户角色:让一个原型克隆自己来得到一个新对象。
2) 抽象原型角色:实现了自己的clone 方法,扮演这种角色的类通常是抽象类,且它具有许多具体的子类。
3) 具体原型角色:被复制的对象,为抽象原型角色的具体子类。

二、UML类图:

三、代码实现:

JAVA:

Prototype.java:

//原型抽象类
public abstract class Prototype implements Cloneable{
String name;

public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}

public Object clone(){
Object object = null;
try {
object = super.clone();
} catch (CloneNotSupportedException exception) {
System.err.println("AbstractPrototype is not Cloneable");
}
return object;
}
}

//原型实现类
class ConcretePrototype1 extends Prototype {

public ConcretePrototype1() {
// TODO Auto-generated method stub
setName("ConcretePrototype1");
}

}

class ConcretePrototype2 extends Prototype {

public ConcretePrototype2() {
// TODO Auto-generated method stub
setName("ConcretePrototype2");
}

}

testMain.java:

public class testMain {

public static void main(String[] args) throws CloneNotSupportedException {
Prototype pt1 = new ConcretePrototype1();
Prototype pt2 = (Prototype) pt1.clone();
Prototype pt3 = new ConcretePrototype2();
Prototype pt4 = (Prototype) pt3.clone();

System.out.println("1:"+pt1.getName());
System.out.println("2:"+pt2.getName());
System.out.println("3:"+pt3.getName());
System.out.println("4:"+pt4.getName());

}
}

输出结果:

1:ConcretePrototype1
2:ConcretePrototype1
3:ConcretePrototype2
4:ConcretePrototype2

C++:

Prototype.h:

/*
* Prototype.h
*
* Created on: 2013-6-23
* Author: yan chao

*/

#ifndef PROTOTYPE_H_
#define PROTOTYPE_H_

// 虚拟基类,所有原型的基类,提供Clone接口函数
class Prototype
{
public:
Prototype(){}
virtual ~Prototype(){}

virtual Prototype* Clone() = 0;
};

// 派生自Prototype,实现Clone方法
class ConcreatePrototype1 : public Prototype
{
public:
ConcreatePrototype1();
ConcreatePrototype1(const ConcreatePrototype1&);
virtual ~ConcreatePrototype1();

virtual Prototype* Clone();
};

// 派生自Prototype,实现Clone方法
class ConcreatePrototype2 : public Prototype
{
public:
ConcreatePrototype2();
ConcreatePrototype2(const ConcreatePrototype2&);
virtual ~ConcreatePrototype2();

virtual Prototype* Clone();
};


#endif /* PROTOTYPE_H_ */

Prototype.cpp:

//============================================================================
// Name : Prototype.cpp
// Author : yan chao
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include "Prototype.h"
#include

ConcreatePrototype1::ConcreatePrototype1()
{
std::cout << "construction of ConcreatePrototype1n" << std::endl;
}

ConcreatePrototype1::~ConcreatePrototype1()
{
std::cout << "destruction of ConcreatePrototype1n"<< std::endl;
}

ConcreatePrototype1::ConcreatePrototype1(const ConcreatePrototype1&)
{
std::cout << "copy construction of ConcreatePrototype1n"<< std::endl;
}

Prototype* ConcreatePrototype1::Clone()
{
return new ConcreatePrototype1(*this);
}

ConcreatePrototype2::ConcreatePrototype2()
{
std::cout << "construction of ConcreatePrototype2n"<< std::endl;
}

ConcreatePrototype2::~ConcreatePrototype2()
{
std::cout << "destruction of ConcreatePrototype2n"<< std::endl;
}

ConcreatePrototype2::ConcreatePrototype2(const ConcreatePrototype2&)
{
std::cout << "copy construction of ConcreatePrototype2n"<< std::endl;
}

Prototype* ConcreatePrototype2::Clone()
{
return new ConcreatePrototype2(*this);
}

testMain.cpp:

/*
* testMain.cpp
*
* Created on: 2013-6-23
* Author: yan chao
*/

#include "Prototype.h"
#include

int main()
{
Prototype* pPrototype1 = new ConcreatePrototype1();
Prototype* pPrototype2 = pPrototype1->Clone();

Prototype* pPrototype3 = new ConcreatePrototype2();
Prototype* pPrototype4 = pPrototype3->Clone();

delete pPrototype1;
delete pPrototype2;
delete pPrototype3;
delete pPrototype4;

system("pause");

return 0;
}

运行结果:

construction of ConcreatePrototype1n
copy construction of ConcreatePrototype1n
construction of ConcreatePrototype2n
copy construction of ConcreatePrototype2n
destruction of ConcreatePrototype1n
destruction of ConcreatePrototype1n
destruction of ConcreatePrototype2n
destruction of ConcreatePrototype2n

感谢你能够认真阅读完这篇文章,希望小编分享的"在C++和Java中如何实现原型模式 "这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

原型 对象 方法 模式 角色 篇文章 C++ 原始 品类 子类 接口 更多 模型 等级 类型 结构 结果 代码 价值 兴趣 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手机数据无法连接服务器怎么回事 华为长沙软件开发云创新中心 串口服务器技术条件 数据库的概念从七个层次 美国网络安全威胁等级框架 数据库增删改查基本语句使用 数据库文件不变小 数据库姓名笔画排序函数 db2数据库结果如何导出 大国重器第二季中国网络安全 甲骨文云服务器流量查询 魔兽怀旧服服务器主机配置 扫黄打非网络安全课堂 人人商城服务器请求失败 软件数据库怎么获取 数据库文件的格式转换 数字货币钱包软件开发公司 计算机网络技术应用试卷 山东网络卫星授时服务器 英雄联盟进哪个服务器好一些 济南安卓软件开发招聘信息 分布式存储和中心化数据库 单线ip服务器怎么样 医院数据库运维证书 db2数据库结果如何导出 大学生网络安全手抄报3a纸 饥荒联机版怎么启动不了服务器 嘉胜网络技术 月付服务器租用 上海丽博网络技术
0