微网站后台录入,2023网页游戏排行榜,电商型网站,贸易公司名称大全简单大气原型模式是一种创建型设计模式#xff0c;使调用方能够复制已有对象#xff0c;而又无需使代码依赖它们所属的类。当有一个类的实例#xff08;原型#xff09;#xff0c;并且想通过复制原型来创建新对象时#xff0c;通常会使用原型模式。 
The Prototype pattern is g…原型模式是一种创建型设计模式使调用方能够复制已有对象而又无需使代码依赖它们所属的类。当有一个类的实例原型并且想通过复制原型来创建新对象时通常会使用原型模式。 
The Prototype pattern is generally used when we have an instance of the class (prototype) and wed like to 
create new objects by just copying the prototype.结构设计 
原型模式包含如下角色 Prototype原型类用来声明克隆方法。在绝大多数情况下只会有一个名为 clone 的方法。 ConcretePrototype具体原型类用来实现克隆方法。除了将原始对象的数据复制到克隆体中之外该方法有时还需处理克隆过程中的极端情况 例如克隆关联对象和梳理递归依赖等等。 原型模式类图表示如下  
伪代码实现 
接下来将使用代码介绍下原型模式的实现。 
// 1.定义原型接口用来声明克隆方法
public interface Prototype {/*** 复制对象** return 复制后的对象*/Prototype clone();
}
// 2、定义具体原型类(ConcretePrototype)用来实现克隆方法
public class ConcretePrototype implements Prototype {private String field;public ConcretePrototype() {}public String getField() {return field;}public ConcretePrototype(String field) {this.field  field;}Overridepublic Prototype clone() {ConcretePrototype concretePrototype  new ConcretePrototype();concretePrototype.field  this.field;return concretePrototype;}
}
// 3、客户端调用
public class PrototypeClient {public PrototypeClient() {}// 调用方式调用具体原型实例的克隆方法public void test() {Prototype concretePrototype  new ConcretePrototype(foo);ConcretePrototype clonedPrototype  (ConcretePrototype) concretePrototype.clone();System.out.println(clonedPrototype.getField());}
}需要说明的是对于Java语言来说Object基类已经提供了一个clone的保护方法用于实现对象的浅复制。注意只有实现了Cloneable接口才可以调用该方法 否则抛出CloneNotSupportedException异常。更多clone方法的介绍可以参考笔者之前的文章。 
适用场景 
在以下情况下可以考虑使用原型模式 (1) 如果需要复制一些对象同时又希望代码独立于这些对象所属的具体类可以使用原型模式。 例如代码里需要处理第三方接口传递过来的对象时即使不考虑代码耦合的情况 调用方的代码也不能依赖这些对象所属的具体类因为无法知道它们的具体信息。 原型模式可以为调用方提供一个通用接口调用方可通过这一接口与所有实现了克隆的对象进行交互它也使得调用方与其所克隆的对象具体类独立开来。 (2) 如果子类的区别仅在于其对象的初始化方式那么可以使用原型模式来减少子类的数量。 在原型模式中 可以使用一系列预生成的、各种类型的对象作为原型(原型对象池)。客户端不必根据需求对子类进行实例化只需找到合适的原型并对其进行克隆即可。 
优缺点 
原型模式有以下优点 (1) 将对象克隆与对象所属的具体类分离(解耦)避免克隆对象与具体类的紧耦合。 (2) 简化了复杂对象的初始化代码。对一些复杂对象可以通过提供克隆方法来简化调用方的使用。 (3) 提供了除继承以外的方式来实现复杂对象的初始化。继承建立了子类与父类的强耦合如果可以尽量不要使用继承。 但是原型模式也存在以下缺点 (1) 在重写克隆方法时对于复杂对象的关联对象或递归依赖等处理相比麻烦一些。 
参考 
《设计模式可复用面向对象软件的基础》 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides 著 李英军, 马晓星 等译 https://www.cnblogs.com/adamjwh/p/9033550.html 简说设计模式——原型模式 https://refactoringguru.cn/design-patterns/prototype 原型模式 https://www.baeldung.com/java-pattern-prototype Prototype Pattern in Java