3. 原型模式(Prototype Pattern)
原型模式,顾名思义,就是有一个原型,可以根据这个原型来创建其他的对象,当要创建一些列相似的对象时,使用原型来克隆总比直接创建一个新的对象要来的直接。
还是举个例子吧,比如说一个配钥匙的过程,不过使用一个非常笨的方法。
首先是一个钥匙的类:
public class Key {
// 使用一个整形变量来代表钥匙的形状吧
private int shape = 0;
public int getShape() {
return shape;
}
public void setShape(int shape) {
this.shape = shape;
}
}
其次是一个配钥匙的机器:
public class KeyCopier {
public Key copy(Key key){
Key newKey = new Key();
newKey.setShape(key.getShape());
return newKey;
}
}
最后是测试的客户端:
public class Client {
public static void main(String[] args) {
Key key = new Key();
key.setShape(1);
KeyCopier copier = new KeyCopier();
Key newKey = copier.copy(key);
}
}
上边的三个类模拟了一个配钥匙的过程,对一个Key进行了复制,但是,严格的说,上边的实现挺麻烦的,并且没有什么通用性,每次都要了解要被复制的对象的内部结构,其实就是把老对象和新对象间的状态复制过程封装了一下。java有很好的实现方式,就是java本身提供的#clone()方法。
比如上边的这个配钥匙的例子,用#clone()方法的实现如下。在这里,我修改了钥匙这个类中表示形状的成员,把它独立出来作为一个类Shape。
public class Shape {
private int state = 0;
public Shape(int state) {
this.state = state;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
}
然后是Key
public class Key implements Cloneable {
// 使用一个整形变量来代表钥匙的形状吧
private Shape shape = null;
public Key(Shape shape){
this.shape = shape;
}
public Shape getShape() {
return shape;
}
public void setShape(Shape shape) {
this.shape = shape;
}
public Object clone() {
Key obj = null;
try {
obj = (Key) super.clone();
} catch (CloneNotSupportedException e) {
}
return obj;
}
}
最后是客户端:
public class Client {
public static void main(String[] args) {
Shape shape = new Shape(1);
Key key = new Key(shape);
// 克隆了钥匙
Key newKey = (Key) key.clone();
System.out.println(newKey.getShape().getState());
}
}
执行Client之后,控制台会显示出 "1",说明同之前的那个Key的状态时相同的。
不过我们还可以做下面的一个实验,把Client做一些修改:
public class Client {
public static void main(String[] args) {
Shape shape = new Shape(1);
Key key = new Key(shape);
// 克隆了钥匙
Key newKey = (Key) key.clone();
Shape newShape = newKey.getShape();
newShape.setState(0);
System.out.println(key.getShape().getState());
}
}
程序会在控制台打印 "0";
修改了克隆后的新的钥匙的State,不过原来的钥匙的State也发生了变化。也就是说前后两个钥匙的状态发生了联系,这个与原型模式是相违背的。
上述的那个Clone()方法在java中叫"影子克隆",对所有状态进行的克隆,叫做"深度克隆"。我们来继续改写上边的例子。
public class Shape implements Cloneable {
private int state = 0;
public Shape(int state) {
this.state = state;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
//实现Clone()方法
public Object clone() {
Shape obj = null;
try {
obj = (Shape) super.clone();
} catch (CloneNotSupportedException e) {
}
return obj;
}
}
public class Key implements Cloneable {
// 使用一个整形变量来代表钥匙的形状吧
private Shape shape = null;
public Key(Shape shape) {
this.shape = shape;
}
public Shape getShape() {
return shape;
}
public void setShape(Shape shape) {
this.shape = shape;
}
public Object clone() {
Key obj = null;
try {
obj = (Key) super.clone();
} catch (CloneNotSupportedException e) {
}
// 加入了Shape的Clone
obj.setShape((Shape) shape.clone());
return obj;
}
}
public class Client {
public static void main(String[] args) {
Shape shape = new Shape(1);
Key key = new Key(shape);
// 克隆了钥匙
Key newKey = (Key) key.clone();
Shape newShape = newKey.getShape();
newShape.setState(0);
System.out.println(key.getShape().getState());
}
}
这次的结果就是"1"了。
最后,给出原型模式的类图:
- 大小: 16.5 KB
分享到:
相关推荐
JAVA-设计模式-创建型模式-原型模式
原型模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在原型模式中,一个对象可以被克隆以创建新对象,而无需知道具体的创建细节。这种模式在需要重复创建相似对象时非常有用,避免了每次创建新对象时都...
原型模式是设计模式中的一种,它是Java 23种经典设计模式之一,主要用来提高对象创建的效率。在原型模式中,我们通过复制或克隆一个已经存在的对象来创建新的对象,而不是通过构造函数来创建。这种方法尤其适用于当...
即原型模式,提供一个已经存在的对象进行新对象创建的接口,一般情况下都是使用Clone接口。 此模式非常简单,简单的说就是复制多个当前对象供使用。Prototype模式允许一个对象再创建另外一个可定制的对象,根本...
原型模式是一种创建型设计模式,它的主要思想是通过复制已有对象来创建新对象,而不是通过构造函数来创建。这种模式可以有效地减少对象创建时的开销,尤其是在需要创建大量相似对象的情况下。在Android中,原型模式...
原型模式是一种创建型设计模式,它的主要思想是通过复制已有对象来创建新对象,而不是通过构造函数来创建。这种模式适用于对象创建成本较高或者初始化过程复杂的情况,通过克隆已存在的对象,可以显著提升效率。 在...
【设计模式之创建型模式实验】 创建型设计模式主要关注对象的创建,它们提供了一种在不指定具体类的情况下创建对象的方式,增强了系统的灵活性和可扩展性。在本实验中,我们将探讨五种常见的创建型设计模式:简单...
在iOS应用开发中,设计模式是一种经过验证的解决常见编程问题的方法,它们是经验的结晶,可以帮助开发者写出可维护、可扩展的代码。本文将详细探讨"原型设计模式"(Prototype Design Pattern)及其在iOS中的应用。 ...
原型模式(Prototype Pattern)是一种创建型设计模式,允许通过复制现有对象来创建新对象,而不是通过实例化类来创建新对象。在需要创建大量相似对象时非常有用,它可以避免重复创建对象,从而提高性能,并且可以...
原型模式(Prototype Pattern)是软件设计模式中的一种结构型模式,它的主要目的是通过复制已有对象来创建新对象,从而减少创建新对象的成本。在原型模式中,类的实例化过程被替换为对已有实例的克隆操作,尤其适用...
原型模式(Prototype Pattern)是其中一种行为设计模式,主要用于对象创建。它通过复制已有对象来创建新对象,而不是通过传统的构造函数来创建。在Java中,原型模式可以有效地提高性能,特别是在创建复杂对象时。 #...
设计模式05-建造者、原型模式 设计模式06-适配器、桥接、组合模式 设计模式07-组合模式、装饰模式 设计模式09-外观模式、享元模式 设计模式10-代理模式、结构型模式大复习 设计模式11-行为模式-责任链、命令模式 ...
原型模式是 Java 设计模式之一,它用于创建对象时,指定创建对象的类型,并通过拷贝这些原型创建新的对象。该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。 原型模式的...
原型模式(Prototype Pattern)是其中一种行为设计模式,它允许我们通过复制现有对象来创建新对象,而不是通过传统方式实例化新对象。这一模式尤其适用于创建复杂或昂贵的对象,因为它提供了对象克隆的能力,从而...
iOS中的原型模式(Prototype)是一种设计模式,它允许我们通过复制已有对象来创建新的对象,而无需知道具体的创建过程。这种模式在某些情况下能够提高代码的可复用性和效率,特别是当创建新对象的步骤复杂时。 原型...
原型模式(Prototype Pattern)是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而无需知道具体创建过程的细节。这种模式的核心在于,它提供了一种对象克隆的简便方法,使得对象的创建过程对用户...
#### 三、设计模式的描述方法 **描述设计模式的方法:** 设计模式的描述通常包括以下几个部分: 1. **模式名称**:简洁明了地概括模式的核心。 2. **问题**:描述该模式所解决的问题背景及情境。 3. **解决方案**:...
**原型设计模式(Prototype Pattern)**是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而不是通过构造函数来实例化新对象。在面向对象编程中,当我们需要频繁地创建具有相同或相似属性的对象时,...