原型模式的定义与特点

原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。例如,Windows 操作系统的安装通常较耗时,如果复制就快了很多。在生活中复制的例子非常多,这里不一一列举了。

原型模式的结构与实现

由于 Java 提供了对象的 clone() 方法,所以用 Java 实现原型模式很简单。

1. 模式的结构

原型模式包含以下主要角色。

  1. 抽象原型类:规定了具体原型对象必须实现的接口。
  2. 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
  3. 访问类:使用具体原型类中的 clone() 方法来复制新的对象。

其结构图如图 1 所示。


图1 原型模式的结构图

2. 模式的实现

原型模式的克隆分为浅克隆和深克隆,Java 中的 Object 类提供了浅克隆的 clone() 方法,具体原型类只要实现 Cloneable 接口就可实现对象的浅克隆,这里的 Cloneable 接口就是抽象原型类。其代码如下:

//具体原型类
class Realizetype implements Cloneable
{Realizetype(){System.out.println("具体原型创建成功!");}public Object clone() throws CloneNotSupportedException{System.out.println("具体原型复制成功!");return (Realizetype)super.clone();}
}
//原型模式的测试类
public class PrototypeTest
{public static void main(String[] args)throws CloneNotSupportedException{Realizetype obj1=new Realizetype();Realizetype obj2=(Realizetype)obj1.clone();System.out.println("obj1==obj2?"+(obj1==obj2));}
}

程序的运行结果如下:

具体原型创建成功!
具体原型复制成功!
obj1==obj2?false

原型模式的应用实例

【例1】用原型模式模拟“孙悟空”复制自己。

分析:孙悟空拔下猴毛轻轻一吹就变出很多孙悟空,这实际上是用到了原型模式。这里的孙悟空类 SunWukong 是具体原型类,而 Java 中的 Cloneable 接口是抽象原型类。

同前面介绍的猪八戒实例一样,由于要显示孙悟空的图像(点击此处下载该程序所要显示的孙悟空的图片),所以将孙悟空类定义成面板 JPanel 的子类,里面包含了标签,用于保存孙悟空的图像。

另外,重写了 Cloneable 接口的 clone() 方法,用于复制新的孙悟空。访问类可以通过调用孙悟空的 clone() 方法复制多个孙悟空,并在框架窗体 JFrame 中显示。图 2 所示是其结构图。


图2 孙悟空生成器的结构图

程序代码如下:

import java.awt.*;
import javax.swing.*;
class SunWukong extends JPanel implements Cloneable
{private static final long serialVersionUID = 5543049531872119328L;public SunWukong(){JLabel l1=new JLabel(new ImageIcon("src/Wukong.jpg"));this.add(l1);   }public Object clone(){SunWukong w=null;try{w=(SunWukong)super.clone();}catch(CloneNotSupportedException e){System.out.println("拷贝悟空失败!");}return w;}
}
public class ProtoTypeWukong
{public static void main(String[] args){JFrame jf=new JFrame("原型模式测试");jf.setLayout(new GridLayout(1,2));Container contentPane=jf.getContentPane();SunWukong obj1=new SunWukong();contentPane.add(obj1);       SunWukong obj2=(SunWukong)obj1.clone();contentPane.add(obj2);   jf.pack();       jf.setVisible(true);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   }
}

程序的运行结果如图 3 所示。


图3 孙悟空克隆器的运行结果

用原型模式除了可以生成相同的对象,还可以生成相似的对象,请看以下实例。

【例2】用原型模式生成“三好学生”奖状。

分析:同一学校的“三好学生”奖状除了获奖人姓名不同,其他都相同,属于相似对象的复制,同样可以用原型模式创建,然后再做简单修改就可以了。图 4 所示是三好学生奖状生成器的结构图。


图4 奖状生成器的结构图

程序代码如下:

public class ProtoTypeCitation
{public static void main(String[] args) throws CloneNotSupportedException{citation obj1=new citation("张三","同学:在2016学年第一学期中表现优秀,被评为三好学生。","韶关学院");obj1.display();citation obj2=(citation) obj1.clone();obj2.setName("李四"); obj2.display();}
}
//奖状类
class citation implements Cloneable
{String name;String info;String college;citation(String name,String info,String college){this.name=name;this.info=info;this.college=college;System.out.println("奖状创建成功!");}void setName(String name){this.name=name;}String getName(){return(this.name);}void display(){System.out.println(name+info+college);}public Object clone() throws CloneNotSupportedException{System.out.println("奖状拷贝成功!");return (citation)super.clone();}
}

程序运行结果如下:

奖状创建成功!
张三同学:在2016学年第一学期中表现优秀,被评为三好学生。韶关学院
奖状拷贝成功!
李四同学:在2016学年第一学期中表现优秀,被评为三好学生。韶关学院

原型模式的应用场景

原型模式通常适用于以下场景。

  • 对象之间相同或相似,即只是个别的几个属性不同的时候。
  • 对象的创建过程比较麻烦,但复制比较简单的时候。

原型模式的扩展

原型模式可扩展为带原型管理器的原型模式,它在原型模式的基础上增加了一个原型管理器 PrototypeManager 类。该类用 HashMap 保存多个复制的原型,Client 类可以通过管理器的 get(String id) 方法从中获取复制的原型。其结构图如图 5 所示。


图5 带原型管理器的原型模式的结构图

【例3】用带原型管理器的原型模式来生成包含“圆”和“正方形”等图形的原型,并计算其面积。分析:本实例中由于存在不同的图形类,例如,“圆”和“正方形”,它们计算面积的方法不一样,所以需要用一个原型管理器来管理它们,图 6 所示是其结构图。


图6 图形生成器的结构图

程序代码如下:

import java.util.*;
interface Shape extends Cloneable
{public Object clone();    //拷贝public void countArea();    //计算面积
}
class Circle implements Shape
{public Object clone(){Circle w=null;try{w=(Circle)super.clone();}catch(CloneNotSupportedException e){System.out.println("拷贝圆失败!");}return w;}public void countArea(){int r=0;System.out.print("这是一个圆,请输入圆的半径:");Scanner input=new Scanner(System.in);r=input.nextInt();System.out.println("该圆的面积="+3.1415*r*r+"\n");}
}
class Square implements Shape
{public Object clone(){Square b=null;try{b=(Square)super.clone();}catch(CloneNotSupportedException e){System.out.println("拷贝正方形失败!");}return b;}public void countArea(){int a=0;System.out.print("这是一个正方形,请输入它的边长:");Scanner input=new Scanner(System.in);a=input.nextInt();System.out.println("该正方形的面积="+a*a+"\n");}
}
class ProtoTypeManager
{private HashMap<String, Shape>ht=new HashMap<String,Shape>(); public ProtoTypeManager(){ht.put("Circle",new Circle());ht.put("Square",new Square());} public void addshape(String key,Shape obj){ht.put(key,obj);}public Shape getShape(String key){Shape temp=ht.get(key);return (Shape) temp.clone();}
}
public class ProtoTypeShape
{public static void main(String[] args){ProtoTypeManager pm=new ProtoTypeManager();    Shape obj1=(Circle)pm.getShape("Circle");obj1.countArea();          Shape obj2=(Shape)pm.getShape("Square");obj2.countArea();     }
}

运行结果如下所示:

这是一个圆,请输入圆的半径:3
该圆的面积=28.2735这是一个正方形,请输入它的边长:3
该正方形的面积=9

java设计模式--2.原型模式相关推荐

  1. java设计模式之原型模式和建造者模式的写法(二)

    背景 原型模式和建造者模式属于创建型模式,在开发中经常会用到,那么这两种设计模式是怎么写的呢,下面进行代码演示. 原型模式 原型模式的核心就是复制 package com.example.protot ...

  2. 北京Java培训 | java设计模式之原型模式

    克隆羊问题 现在有一只羊tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和tom羊 属性完全相同的10只羊. 传统方式解决克隆羊问题 传统的方式的优缺点 1) 优点是比较好理解,简 ...

  3. java prototype是什么,java设计模式-原型模式(Prototype)

    定义 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象.这就是原型模式的用意 原型模式的结构 原型模式要求对象实现同一个可 ...

  4. java设计模式中—原型模式

    文章目录 原型介绍 实现 原型模式 原型中拷贝 浅拷贝 深拷贝 使用clone 方式 序列化方式 总结 原型介绍 举个栗子:大话西游里,孙悟空对战牛魔王,孙悟空拔了一个猴毛一吹,变出了一堆" ...

  5. 【Java设计模式】原型模式

    ✍ 在软件系统中 , 有些对象的创建过程较为复杂 , 而且有时候需要频繁创建 , 原型模式通过给出一个原型对象来指明所要创建的对象的类型 , 然后用复制这个原型对象的办法创建出更多同类型的对象, 这就 ...

  6. 【Java设计模式】原型模式、建造者模式

    原型模式 概述 用一个已经创建的实例体为原型,通过复制该原型对象来创建一个和原型对象相同的对象. 结构 原型模式包含如下角色: 抽象原型类:规定了具体原型对象必须实现的的clone ()方法. 具体原 ...

  7. Java设计模式之原型模式(浅克隆,深克隆)

    一.原型模式: 概述: 创建型模式之一,它通过复制一个已有对象来获取更多相同或相似的对象,可提高对象创建效率,简化创建过程. 原理: 将一个原型对象传给要发动创建的对象(如客户端对象),这个客户端对象 ...

  8. Java 设计模式之原型模式

    原型模式主要用于复制对象,尤其是创建过程很复杂的情况,原型模式可以简化创建过程,提高性能,一般用于一个对象的属性已经确定,需要产生很多相同对象的时候,其实很少使用这种模式. 实现原型模式需要两点:第一 ...

  9. Java设计模式之原型模式

    原型模式(Prototype Pattern)属于对象创建型模式,通过克隆指定原型对象创建新对象. 优点: 效率高:原型模式可以简化创建对象的创建过程,通过克隆一个已有的实例可以提高新实例的创建效率: ...

最新文章

  1. linux文件每行长度,linux – 根据第一列/行中的字符长度对文件进行排序
  2. 图解Ubuntu 9.10 Alpha 6
  3. 对家庭网络设备行业的理解
  4. java动态添加view
  5. 在线批量压缩JPG图片-JpegMini
  6. 57-Insert Interval
  7. 论文翻译器:pdf 英文论文一键转换成中英文对照的文档
  8. html 指针图表,HTML5 canvas 指针时钟
  9. 在edge浏览器找不到internet选项?
  10. CF 285D 285E
  11. Android开放root权限
  12. uniapp仿网易云音乐项目(发布小程序、H5和安卓App)
  13. word左边左对齐,右边右对齐
  14. c++多线程学习11 packaged_task与async
  15. java常见的设计模式
  16. 域帐号密码快过期邮件提醒
  17. 深度学习(一)—— 深度学习概述
  18. 计算机网络基础知识满昌勇,中职中专学校《计算机网络基础》教学大纲可打印.doc...
  19. matlab读csv文件
  20. android 地图导航开发思路,基础功能-导航组件-开发指南-Android 导航SDK | 高德地图API...

热门文章

  1. 使用Python对物流行业数据进行数据分析
  2. 以下选项中使python脚本程序转变为_以下选项中使python脚本程序转变为可执行程序的第三方库的是:...
  3. Octave、Anaconda安装和jupyter notebook的使用
  4. C++学习积累(长期更新)——符号相关
  5. SQL Serve Intersect(交集)
  6. Cocos 赋能华为 XR 内容创作生态,现已支持华为 VR 设备和 XR 平台
  7. java jstack使用_JAVA语言之JVM 中jstack命令使用详解
  8. 关于UsedRange方法选中了空区域的解决方案
  9. Fifth-自动旋转和自动调整大小
  10. hive string 转数组:抽取数组中的key 然后列转行