`

原型模式

阅读更多
原型模式(Prototype): 用原型实例指定创建对象的种类,并且通过拷贝原型来创建新的实例对象。它允许一个对象再创建另外一个可定制的对象,根本无需知道任何创建细节,工作原理,通过将一个原型对象传给那个要发动创建的对象,这个发动创建对象通过请求原型对象拷贝它们自己来创建。
通俗点,就是通过拷贝来进行创建实例。
原型模式适合在什么场景使用?一是类初始化需要消化非常多的资源,这个资源包括数据、硬件资源
等;二是通过new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式;三是一个对
象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对
象供调用者使用。在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过clone
的方法创建一个对象,然后由工厂方法提供给调用者。

package pattern.prototype;

public class Car implements Cloneable {
	private String name;
	private Wheel wheel;

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setWheel(Wheel wheel) {
		this.wheel = wheel;
	}

	public Wheel getWheel() {
		return wheel;
	}

	public Object clone() {
		Car car = null;
		try {
			car = (Car) super.clone();
			car.wheel= (Wheel) this.wheel.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return car;
	}
}


package pattern.prototype;

public class Wheel implements Cloneable {
	private String name;

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public Object clone() {
		Wheel wheel = null;
		try {
			wheel = (Wheel) super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return wheel;
	}
}


package pattern.prototype;

public class Test {
	public static void main(String[] args) {
		Car car1 = new Car();
		car1.setName("Benz");
		Wheel w = new Wheel();
		w.setName("AA");
		car1.setWheel(w);
		Car car2=(Car) car1.clone();
		System.out.println(car1.getName());
		System.out.println(car1.getWheel().getName());
		System.out.println("*********************************");
		car2.getWheel().setName("BB");
		car2.setName("toyota");
		System.out.println(car2.getName());
		System.out.println(car2.getWheel().getName());
		System.out.println("*********************************");
		
		System.out.println(car1.getName());
		System.out.println(car1.getWheel().getName());
	}
}




下面是通过Java序列化实现的原型模式,通过将对象序列化,可以实现深拷贝,这种方式可以不用在每个关联对象中添加clone方法,只须实现Serializable接口.故是一种提倡用法:

package pattern.prototype;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Car implements Serializable {
	/**
	 * 
	 */

	private String name;
	private Wheel wheel;

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setWheel(Wheel wheel) {
		this.wheel = wheel;
	}

	public Wheel getWheel() {
		return wheel;
	}

	// public Object clone() {
	// Car car = null;
	// try {
	// car = (Car) super.clone();
	// car.wheel= (Wheel) this.wheel.clone();
	// } catch (CloneNotSupportedException e) {
	// // TODO Auto-generated catch block
	// e.printStackTrace();
	// }
	// return car;
	// }

	public static Object copy(Object oldObj) {
		Object obj = null;
		try {
			System.out.println(oldObj + " dfdf");
			// Write the object out to a byte array
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			ObjectOutputStream out = new ObjectOutputStream(bos);
			out.writeObject(oldObj);
			out.flush();
			out.close();
			// Retrieve an input stream from the byte array and read
			// a copy of the object back in.
			ByteArrayInputStream bis = new ByteArrayInputStream(bos
					.toByteArray());
			ObjectInputStream in = new ObjectInputStream(bis);
			obj = in.readObject();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException cnfe) {
			cnfe.printStackTrace();
		}
		return obj;
	}

}



package pattern.prototype;

import java.io.Serializable;

public class Wheel implements Serializable {
	private String name;

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public Object clone() {
		Wheel wheel = null;
		try {
			wheel = (Wheel) super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return wheel;
	}
}


package pattern.prototype;

public class Test {
	public static void main(String[] args) {
		Car car1 = new Car();
		car1.setName("Benz");
		Wheel w = new Wheel();
		w.setName("AA");
		car1.setWheel(w);
		Car car2=(Car) Car.copy(car1);
		System.out.println(car1.getName());
		System.out.println(car1.getWheel().getName());
		System.out.println("*********************************");
		car2.getWheel().setName("BB");
		car2.setName("toyota");
		System.out.println(car2.getName());
		System.out.println(car2.getWheel().getName());
		System.out.println("*********************************");
		
		System.out.println(car1.getName());
		System.out.println(car1.getWheel().getName());
	}
}



  • 大小: 16.5 KB
分享到:
评论

相关推荐

    设计模式之原型模式

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

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

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

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

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

    android设计模式之原型模式

    本文将深入探讨Android设计模式中的“原型模式”(Prototype Pattern),并结合提供的"prototype"压缩包中的示例代码进行解析。 原型模式是一种创建型设计模式,它的主要思想是通过复制已有对象来创建新对象,而...

    设计模式——原型模式

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

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

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

    Java 23种设计模式08原型模式.pdf

    ### Java设计模式之原型模式深度解析 #### 模式动机 在面向对象编程的世界里,对象的创建往往伴随着复杂的逻辑处理。特别是在某些场景下,对象的构造过程可能涉及大量资源的消耗,例如数据库连接、文件读写等。在...

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】 * 原型模式(Prototype) * 实现方式: * 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 ...

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

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

    设计模式之原型模式.docx

    【设计模式之原型模式】 设计模式是软件工程中的一种最佳实践,是对在特定上下文中反复出现的软件设计问题的解决方案。原型模式属于对象创建型模式,它的主要思想是通过复制已有对象来创建新对象,降低了类的实例化...

    23种设计模式详解PDF

    设计模式 的分类 总体来说设计模式分为三大类: 创建型模式(5): 工厂方法模式 、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式(7): 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、...

    C#23种设计模式样例代码和UML图

    C#23种设计模式样例代码和UML图等 创建型模式(抽象工厂模式、工厂方法模式、单例模式、建造者模式、原型模式); 行为型模式(策略模式、 迭代器模式、原型模式、职责链模式、 模板方法、 命令模式、 解释器模式、 ...

    《Java设计模式》课后习题参考答案-刘伟(20180723).pdf

    JDK中许多类和方法都使用了设计模式,这些模式的应用帮助实现了代码的高内聚、低耦合,提高了代码的可维护性和扩展性。下面介绍几种常见的设计模式及其在JDK中的应用实例: a) 抽象工厂模式(AbstractFactory) ...

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

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

    前端设计模式大全,包括工厂模式,原型模式,构造器模式等

    本资料集包含了多种重要的前端设计模式,如工厂模式、原型模式和构造器模式,下面将详细阐述这些模式的核心概念和应用。 1. 工厂模式: 工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,通过抽象出...

    Java 经典设计模式讲解以及项目实战

    Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...

    设计模式_原型模式.zip

    这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高...

    iOS 设计模式 原型模式

    原型模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。通过拷贝已有对象来创建新对象,避免了直接创建新对象带来的复杂性。在iOS中,这通常通过实现`NSCopying`或`NSCoding`协议来实现。 ### 2. `...

Global site tag (gtag.js) - Google Analytics