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 <iostream>

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 <stdlib.h>

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

转载于:https://blog.51cto.com/flyingsnail/1227994

设计模式(创建型)之原型模式相关推荐

  1. 设计模式(创建型)之建造者模式(Builder Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  2. Java设计模式之创建型:原型模式

    一.什么是原型模式: 原型模式主要用于对象的创建,使用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.UML类图如下: 原型模式的核心是就是原型类 Prototype,Prototype ...

  3. java设计模式——创建型之建造者模式

    自大学课程初识设计模式以来,就越发觉得有必要系统学习一下设计模式. 刚好在实习前准备期间课比较少,抽出一点时间整理一下记一些笔记,复制粘贴比较多. 笔记比较适合学习过设计模式的同学. Builder ...

  4. Java设计模式之创建型:建造者模式

    一.什么是建造者模式: 建造者模式将复杂产品的创建步骤分解在在不同的方法中,使得创建过程更加清晰,从而更精确控制复杂对象的产生过程:通过隔离复杂对象的构建与使用,也就是将产品的创建与产品本身分离开来, ...

  5. 七大设计原则与设计模式(创建型模式、结构型模式、行为型模式)

    七大设计原则 开闭原则.依赖倒置原则.单一职责原则.接口隔离原则.迪米特法则(最少知道原则).里氏替换原则.合成 (组合).聚合复用原则 开闭原则 定义: 一个软件实体如类.模块和函数应该对扩展开放, ...

  6. 软考软件设计师---面向对象技术(设计模式--创建型--工厂、生成器、原型、单例)

    转载于自己博客文章: 软考软件设计师---面向对象技术(设计模式--创建型--工厂.生成器.原型.单例) - 松下之约一.创建型设计模式关注对象的创建,让一个类得到实例化过程由另一类的对象完成.分类: ...

  7. 设计模式(20):创建型-抽象工厂模式(Abstract Factory)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  8. 设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript

    设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript 简单工厂模式 定义一个接口,三个具体类.然后书写如下,通过选择,生产出相应的对象 // 定义Shape接口 interface Sh ...

  9. 设计模式-创建型模式-建造者模式

    设计模式-创建型模式-建造者模式 建造者模式即生成器模式,将一个复杂的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 代码如下 // 产品类 public class Product{pu ...

  10. JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·简单工厂——区分“变与不变”

    JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·简单工厂--区分"变与不变" 先来说说构造器 在介绍工厂模式之前,为了辅助大家的理解,我想先在这儿给大家介绍 ...

最新文章

  1. 停用一些不必要的Windows服务
  2. 虚拟机在安装svn时 认证密码一直报错_研路同行|安装虚拟机到安装GAMIT教程步骤汇总...
  3. JAVA并发编程8_线程池的使用
  4. 算法之组合数学及其算法篇(三) ----- 容斥原理应用以及几个典型的递归关系
  5. Pycharm Anaconda 安装dlib
  6. leetcode869. 重新排序得到 2 的幂
  7. vue基础(学习官方文档)
  8. 上反对下反对推理图_判断推理解题技巧:下反对关系的秒选技巧
  9. 软考中级软件设计师--13.数据结构与算法
  10. http请求过程及性能优化分析
  11. 牛鞭效应matlab代码,牛鞭效应在啤酒游戏中的运用.doc
  12. 单片机笔记五:改进无源蜂鸣片驱动电路
  13. CLIP 论文学习笔记《Learning Transferable Visual Models From Natural Language Supervision》
  14. python怎么从excel获取数据_python怎么从excel中读取数据?/python 读取 excle
  15. linux下的fgetc()与fputc()函数详细介绍及代码演示
  16. 吉首大学2019年程序设计竞赛(重现赛)B——干物妹小埋(树状数组+二分)
  17. Vue经典实例之table表格奇偶行不同颜色、鼠标移入变色、点击变色,一看就明白
  18. 关于C++传递数组时初始化注意事项(允悲)
  19. android禁止下拉刷新,Android开发之无痕过渡下拉刷新控件的实现思路详解
  20. matlab中信赖域法,第8讲信赖域方法.ppt

热门文章

  1. 一份C++学习资源整理,咬牙切齿地好用。
  2. oracle隐藏游标,Oracle 存储过程隐藏游标
  3. android11beta支持什么手机,Android 11 Beta1发布,新增多种功能,网友:Android基于 Flyme...
  4. 文件上传下载-修改文件上传大小
  5. SpringSecurity 认证通过后显示当前认证用户名
  6. 单点登录系统和CAS的简介
  7. Zookeeper的一致性是什么情况?
  8. NamespaceHandler 接口
  9. 基于Xml 的IOC 容器-向容器注册
  10. request获取中文乱码的问题