原文: https://howtodoinjava.com/design-patterns/creational/prototype-design-pattern-in-java/

在构建实际对象之前, 原型是任何对象的模板。 同样在 Java 中,它具有相同的含义。 原型设计模式用于应用需要创建多个类实例的情况,这些实例的状态几乎相同或相差很小。

在这种设计模式中,在启动时会创建一个实际对象的实例(即原型),此后每当需要一个新实例时,都会将该原型克隆为另一个实例。 此模式的主要优势是具有最少的实例创建过程,该过程比克隆过程要昂贵得多。

  1. Table of Contents
  2. Design participants
  3. Problem statement
  4. Implementation

请确保您要对原型进行深克隆或浅克隆,因为两者在运行时的行为不同。 如果需要深度复制,则可以使用在内存序列化中使用此处给出的良好技术。

原型模式 – 参与者

  • 原型:这是如上所述的实际对象的原型。
  • 原型注册表:用作注册表服务,使所有原型都可以使用简单的字符串参数进行访问。
  • 客户端:客户端将负责使用注册表服务访问原型实例。

问题陈述

让我们通过一个例子来了解这种模式。 我正在创建一个娱乐应用,该应用将非常频繁地需要MovieAlbumShow类的实例。 我不想每次都创建它们的实例,因为这很昂贵。 因此,我将创建他们的原型实例,每当我需要一个新实例时,我都将克隆该原型。

原型模式示例 – 实现

让我们从创建类图开始。

Java 中的原型设计模式 - 图1

上面的类图说明了必要的类及其之间的关系。

解决方案中仅增加了一个接口“PrototypeCapable”。 使用此接口的原因是Cloneable接口的损坏行为。 该接口有助于实现以下目标:

  • 能够克隆原型而不知道它们的实际类型
  • 提供要在注册表中使用的类型引用

他们的工作流程将如下所示:

Java 中的原型设计模式 - 图2

让我们敲键盘并编写这些类。

PrototypeCapable.java

  1. package com.howtodoinjava.prototypeDemo.contract;
  2. public interface PrototypeCapable extends Cloneable
  3. {
  4. public PrototypeCapable clone() throws CloneNotSupportedException;
  5. }

Movie.javaAlbum.javaShow.java

  1. package com.howtodoinjava.prototypeDemo.model;
  2. import com.howtodoinjava.prototypeDemo.contract.PrototypeCapable;
  3. public class Movie implements PrototypeCapable
  4. {
  5. private String name = null;
  6. public String getName() {
  7. return name;
  8. }
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. @Override
  13. public Movie clone() throws CloneNotSupportedException {
  14. System.out.println("Cloning Movie object..");
  15. return (Movie) super.clone();
  16. }
  17. @Override
  18. public String toString() {
  19. return "Movie";
  20. }
  21. }
  22. public class Album implements PrototypeCapable
  23. {
  24. private String name = null;
  25. public String getName() {
  26. return name;
  27. }
  28. public void setName(String name) {
  29. this.name = name;
  30. }
  31. @Override
  32. public Album clone() throws CloneNotSupportedException {
  33. System.out.println("Cloning Album object..");
  34. return (Album) super.clone();
  35. }
  36. @Override
  37. public String toString() {
  38. return "Album";
  39. }
  40. }
  41. public class Show implements PrototypeCapable
  42. {
  43. private String name = null;
  44. public String getName() {
  45. return name;
  46. }
  47. public void setName(String name) {
  48. this.name = name;
  49. }
  50. @Override
  51. public Show clone() throws CloneNotSupportedException {
  52. System.out.println("Cloning Show object..");
  53. return (Show) super.clone();
  54. }
  55. @Override
  56. public String toString() {
  57. return "Show";
  58. }
  59. }

PrototypeFactory.java

  1. package com.howtodoinjava.prototypeDemo.factory;
  2. import com.howtodoinjava.prototypeDemo.contract.PrototypeCapable;
  3. import com.howtodoinjava.prototypeDemo.model.Album;
  4. import com.howtodoinjava.prototypeDemo.model.Movie;
  5. import com.howtodoinjava.prototypeDemo.model.Show;
  6. public class PrototypeFactory
  7. {
  8. public static class ModelType
  9. {
  10. public static final String MOVIE = "movie";
  11. public static final String ALBUM = "album";
  12. public static final String SHOW = "show";
  13. }
  14. private static java.util.Map<String , PrototypeCapable> prototypes = new java.util.HashMap<String , PrototypeCapable>();
  15. static
  16. {
  17. prototypes.put(ModelType.MOVIE, new Movie());
  18. prototypes.put(ModelType.ALBUM, new Album());
  19. prototypes.put(ModelType.SHOW, new Show());
  20. }
  21. public static PrototypeCapable getInstance(final String s) throws CloneNotSupportedException {
  22. return ((PrototypeCapable) prototypes.get(s)).clone();
  23. }
  24. }

TestPrototypePattern

  1. package com.howtodoinjava.prototypeDemo.client;
  2. import com.howtodoinjava.prototypeDemo.factory.PrototypeFactory;
  3. import com.howtodoinjava.prototypeDemo.factory.PrototypeFactory.ModelType;
  4. public class TestPrototypePattern
  5. {
  6. public static void main(String[] args)
  7. {
  8. try
  9. {
  10. String moviePrototype = PrototypeFactory.getInstance(ModelType.MOVIE).toString();
  11. System.out.println(moviePrototype);
  12. String albumPrototype = PrototypeFactory.getInstance(ModelType.ALBUM).toString();
  13. System.out.println(albumPrototype);
  14. String showPrototype = PrototypeFactory.getInstance(ModelType.SHOW).toString();
  15. System.out.println(showPrototype);
  16. }
  17. catch (CloneNotSupportedException e)
  18. {
  19. e.printStackTrace();
  20. }
  21. }
  22. }

运行客户端代码时,输出如下。

  1. Cloning Movie object..
  2. Movie
  3. Cloning Album object..
  4. Album
  5. Cloning Show object..
  6. Show

希望您喜欢 Java 原型模式示例上的这篇文章。 如有任何疑问,请发表评论。

下载源码

学习愉快!