原文: https://howtodoinjava.com/design-patterns/creational/prototype-design-pattern-in-java/
在构建实际对象之前, 原型是任何对象的模板。 同样在 Java 中,它具有相同的含义。 原型设计模式用于应用需要创建多个类实例的情况,这些实例的状态几乎相同或相差很小。
在这种设计模式中,在启动时会创建一个实际对象的实例(即原型),此后每当需要一个新实例时,都会将该原型克隆为另一个实例。 此模式的主要优势是具有最少的实例创建过程,该过程比克隆过程要昂贵得多。
Table of ContentsDesign participantsProblem statementImplementation
请确保您要对原型进行深克隆或浅克隆,因为两者在运行时的行为不同。 如果需要深度复制,则可以使用在内存序列化中使用此处给出的良好技术。
原型模式 – 参与者
- 原型:这是如上所述的实际对象的原型。
- 原型注册表:用作注册表服务,使所有原型都可以使用简单的字符串参数进行访问。
- 客户端:客户端将负责使用注册表服务访问原型实例。
问题陈述
让我们通过一个例子来了解这种模式。 我正在创建一个娱乐应用,该应用将非常频繁地需要Movie,Album和Show类的实例。 我不想每次都创建它们的实例,因为这很昂贵。 因此,我将创建他们的原型实例,每当我需要一个新实例时,我都将克隆该原型。
原型模式示例 – 实现
让我们从创建类图开始。

上面的类图说明了必要的类及其之间的关系。
解决方案中仅增加了一个接口“PrototypeCapable”。 使用此接口的原因是Cloneable接口的损坏行为。 该接口有助于实现以下目标:
- 能够克隆原型而不知道它们的实际类型
- 提供要在注册表中使用的类型引用
他们的工作流程将如下所示:

让我们敲键盘并编写这些类。
PrototypeCapable.java
package com.howtodoinjava.prototypeDemo.contract;public interface PrototypeCapable extends Cloneable{public PrototypeCapable clone() throws CloneNotSupportedException;}
Movie.java,Album.java和Show.java
package com.howtodoinjava.prototypeDemo.model;import com.howtodoinjava.prototypeDemo.contract.PrototypeCapable;public class Movie implements PrototypeCapable{private String name = null;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic Movie clone() throws CloneNotSupportedException {System.out.println("Cloning Movie object..");return (Movie) super.clone();}@Overridepublic String toString() {return "Movie";}}public class Album implements PrototypeCapable{private String name = null;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic Album clone() throws CloneNotSupportedException {System.out.println("Cloning Album object..");return (Album) super.clone();}@Overridepublic String toString() {return "Album";}}public class Show implements PrototypeCapable{private String name = null;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic Show clone() throws CloneNotSupportedException {System.out.println("Cloning Show object..");return (Show) super.clone();}@Overridepublic String toString() {return "Show";}}
PrototypeFactory.java
package com.howtodoinjava.prototypeDemo.factory;import com.howtodoinjava.prototypeDemo.contract.PrototypeCapable;import com.howtodoinjava.prototypeDemo.model.Album;import com.howtodoinjava.prototypeDemo.model.Movie;import com.howtodoinjava.prototypeDemo.model.Show;public class PrototypeFactory{public static class ModelType{public static final String MOVIE = "movie";public static final String ALBUM = "album";public static final String SHOW = "show";}private static java.util.Map<String , PrototypeCapable> prototypes = new java.util.HashMap<String , PrototypeCapable>();static{prototypes.put(ModelType.MOVIE, new Movie());prototypes.put(ModelType.ALBUM, new Album());prototypes.put(ModelType.SHOW, new Show());}public static PrototypeCapable getInstance(final String s) throws CloneNotSupportedException {return ((PrototypeCapable) prototypes.get(s)).clone();}}
TestPrototypePattern
package com.howtodoinjava.prototypeDemo.client;import com.howtodoinjava.prototypeDemo.factory.PrototypeFactory;import com.howtodoinjava.prototypeDemo.factory.PrototypeFactory.ModelType;public class TestPrototypePattern{public static void main(String[] args){try{String moviePrototype = PrototypeFactory.getInstance(ModelType.MOVIE).toString();System.out.println(moviePrototype);String albumPrototype = PrototypeFactory.getInstance(ModelType.ALBUM).toString();System.out.println(albumPrototype);String showPrototype = PrototypeFactory.getInstance(ModelType.SHOW).toString();System.out.println(showPrototype);}catch (CloneNotSupportedException e){e.printStackTrace();}}}
运行客户端代码时,输出如下。
Cloning Movie object..MovieCloning Album object..AlbumCloning Show object..Show
希望您喜欢 Java 原型模式示例上的这篇文章。 如有任何疑问,请发表评论。
学习愉快!
