`
zddava
  • 浏览: 243692 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

了解设计模式 之 创建模式(三) -- 原型模式

阅读更多
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-设计模式-创建型模式-原型模式

    设计模式专题之(五)原型模式---设计模式原型模式示例代码(python--c++)

    原型模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在原型模式中,一个对象可以被克隆以创建新对象,而无需知道具体的创建细节。这种模式在需要重复创建相似对象时非常有用,避免了每次创建新对象时都...

    设计模式之原型模式

    原型模式是设计模式中的一种,它是Java 23种经典设计模式之一,主要用来提高对象创建的效率。在原型模式中,我们通过复制或克隆一个已经存在的对象来创建新的对象,而不是通过构造函数来创建。这种方法尤其适用于当...

    设计模式 创建型模式 Prototype模式(原型)

    即原型模式,提供一个已经存在的对象进行新对象创建的接口,一般情况下都是使用Clone接口。 此模式非常简单,简单的说就是复制多个当前对象供使用。Prototype模式允许一个对象再创建另外一个可定制的对象,根本...

    android设计模式之原型模式

    原型模式是一种创建型设计模式,它的主要思想是通过复制已有对象来创建新对象,而不是通过构造函数来创建。这种模式可以有效地减少对象创建时的开销,尤其是在需要创建大量相似对象的情况下。在Android中,原型模式...

    iOS设计模式之原型模式

    原型模式是一种创建型设计模式,它的主要思想是通过复制已有对象来创建新对象,而不是通过构造函数来创建。这种模式适用于对象创建成本较高或者初始化过程复杂的情况,通过克隆已存在的对象,可以显著提升效率。 在...

    设计模式之创建型模式实验.docx

    【设计模式之创建型模式实验】 创建型设计模式主要关注对象的创建,它们提供了一种在不指定具体类的情况下创建对象的方式,增强了系统的灵活性和可扩展性。在本实验中,我们将探讨五种常见的创建型设计模式:简单...

    iOS设计模式-原型设计模式

    在iOS应用开发中,设计模式是一种经过验证的解决常见编程问题的方法,它们是经验的结晶,可以帮助开发者写出可维护、可扩展的代码。本文将详细探讨"原型设计模式"(Prototype Design Pattern)及其在iOS中的应用。 ...

    ava常用设计模式-原型模式

    原型模式(Prototype Pattern)是一种创建型设计模式,允许通过复制现有对象来创建新对象,而不是通过实例化类来创建新对象。在需要创建大量相似对象时非常有用,它可以避免重复创建对象,从而提高性能,并且可以...

    设计模式的原型模式的例子

    原型模式(Prototype Pattern)是软件设计模式中的一种结构型模式,它的主要目的是通过复制已有对象来创建新对象,从而减少创建新对象的成本。在原型模式中,类的实例化过程被替换为对已有实例的克隆操作,尤其适用...

    设计模式之原型模式Java实现和类设计图

    原型模式(Prototype Pattern)是其中一种行为设计模式,主要用于对象创建。它通过复制已有对象来创建新对象,而不是通过传统的构造函数来创建。在Java中,原型模式可以有效地提高性能,特别是在创建复杂对象时。 #...

    设计模式课件大全

    设计模式05-建造者、原型模式 设计模式06-适配器、桥接、组合模式 设计模式07-组合模式、装饰模式 设计模式09-外观模式、享元模式 设计模式10-代理模式、结构型模式大复习 设计模式11-行为模式-责任链、命令模式 ...

    Java设计模式-原型模式详解

    原型模式是 Java 设计模式之一,它用于创建对象时,指定创建对象的类型,并通过拷贝这些原型创建新的对象。该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。 原型模式的...

    c++20设计模式-第4章-原型模式代码

    原型模式(Prototype Pattern)是其中一种行为设计模式,它允许我们通过复制现有对象来创建新对象,而不是通过传统方式实例化新对象。这一模式尤其适用于创建复杂或昂贵的对象,因为它提供了对象克隆的能力,从而...

    IOS设计模式浅析之原型模式(Prototype)--copy - iOS知识库1

    iOS中的原型模式(Prototype)是一种设计模式,它允许我们通过复制已有对象来创建新的对象,而无需知道具体的创建过程。这种模式在某些情况下能够提高代码的可复用性和效率,特别是当创建新对象的步骤复杂时。 原型...

    设计模式——原型模式

    原型模式(Prototype Pattern)是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而无需知道具体创建过程的细节。这种模式的核心在于,它提供了一种对象克隆的简便方法,使得对象的创建过程对用户...

    GOF-设计模式-Design Patterns-英文原版-高清-有目录-有页码

    #### 三、设计模式的描述方法 **描述设计模式的方法:** 设计模式的描述通常包括以下几个部分: 1. **模式名称**:简洁明了地概括模式的核心。 2. **问题**:描述该模式所解决的问题背景及情境。 3. **解决方案**:...

    原型设计模式prototype

    **原型设计模式(Prototype Pattern)**是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而不是通过构造函数来实例化新对象。在面向对象编程中,当我们需要频繁地创建具有相同或相似属性的对象时,...

Global site tag (gtag.js) - Google Analytics