`

设计模式——Prototype(原型)

阅读更多

在工厂模式、建造者模式等中,我们使用了不同的构造方法(各种Factory或者Builder)去代替或者说掩盖Java语言之中“new”这个操作来创建对象实例。Java中要创建一个新的对象并不一定只能靠“new”这个关键字的,我们还有“clone()”

在接触原型模式之前,我们先来了解一下克隆一些知识:

 1.clone()方法在Java中从Object类开始就具备,并且作为原生(Native)方法出现。它默认是protected的,因此在被子类提升可见性之前,无法被外界使用。

2.所有需要进行克隆操作的类都必须实现Cloneable接口,这个接口与Serializable接口一样,没有任何需要实现的方法,仅仅是作为一个标示。

3.所有数组都实现了Cloneable接口,并且已经提升了clone()方法的可见性至public,换句话说数组对象是可以直接调用clone()方法的。

4.克隆分为浅拷贝和深拷贝两种。

浅拷贝:操作基本上可以理解为只拷贝存储于栈中的内容,包括对象中简单类型的数据、指向其他复杂对象的指针等,但是不会将指向的复杂对象也拷贝一次。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。

深拷贝:被复制对象的所有的变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把重复的对象所引用的对象都复制一遍,而这种对被引用到的对象的复制叫做间接复制。

原型模式定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。

浅拷贝:

抽象原型:

public interface Prototype {
	public Object cloneMe() throws CloneNotSupportedException;
}

 

具体原型:

public class Cubic implements Prototype, Cloneable {
	double length, width, height;

	public Cubic(double length, double width, double height) {
		this.length = length;
		this.width = width;
		this.height = height;
	}

	@Override
	public Object cloneMe() throws CloneNotSupportedException {
		//调用从Object类继承的clone()方法; 
		Cubic object=(Cubic) clone();
        return object;
	}
}

       模式使用:

public class CubicTest {
	public static void main(String[] args) {
		  Cubic cubic = new Cubic(12, 20, 66);
          System.out.println("cubic的长、宽和高:");
          System.out.println(cubic.length + "," + cubic.width + ","
                      + cubic.height);
          try {
                Cubic cubicopy = (Cubic) cubic.cloneMe();
                System.out.println("cubicopy的长、宽和高:");
                System.out.println(cubicopy.length + "," + cubicopy.width + ","
                            + cubicopy.height);
          } catch (Exception e) {
        	  e.printStackTrace();
          }
	}
}

 

      深拷贝:

      具体原型:

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

public class Goat implements Prototype, Serializable {

	StringBuffer color;

	public StringBuffer getColor() {
		return color;
	}

	public void setColor(StringBuffer color) {
		this.color = color;
	}

	@Override
	public Object cloneMe() throws CloneNotSupportedException {
		Object object = null;
		try {
			ByteArrayOutputStream outOne = new ByteArrayOutputStream();
			ObjectOutputStream outTwo = new ObjectOutputStream(outOne);
			// 将原型吸入对象输出流
			outTwo.writeObject(this);
			ByteArrayInputStream inOne = new ByteArrayInputStream(
					outOne.toByteArray());
			ObjectInputStream inTwo = new ObjectInputStream(inOne);
			// 创建新对象:原型复制品
			object = inTwo.readObject();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return object;
	}
}

        模式使用:

public class GoatTest {
	public static void main(String[] args) {
		Goat goat = new Goat();
		goat.setColor(new StringBuffer("白色的山羊"));
		System.out.println("goat 是" + goat.getColor());
		try {
			Goat goatCopyGoat = (Goat) goat.cloneMe();
			System.out.println("goatCopy是" + goatCopyGoat.getColor());
			System.out.println("goatCopy将自己的颜色改变成黑色");
			goatCopyGoat.setColor(new StringBuffer("黑色的山羊"));
			System.out.println("goat仍然是" + goat.getColor());
			System.out.println("goatCopy是" + goatCopyGoat.getColor());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

总结:

Prototype模式中实现起来最困难的地方就是内存复制操作,所幸在Java中提供了clone()方法替我们做了绝大部分事情。在其他语言之中,一种比较简单的方法是可以考虑使用序列化技术(Serilization)来完成对象的复制。

 Java语言中clone()方法完成的是浅拷贝的克隆,如果需要深拷贝,也可以考虑使用序列化来完成,当然这样比起Nativeclone()方法来说,效率差了很多,所以更加推荐的方法是针对类中包含的复杂对象情况,重写clone()方法,多次调用父类的clone()来完成,虽然要多写不少代码,但是保证了效率。

分享到:
评论

相关推荐

    C#视频-面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式)

    在本课程中,我们将深入探讨C#编程中的一个重要设计模式——Prototype原型模式,它是创建型设计模式的一种。原型模式主要用于简化实例化过程,通过复制已有对象来创建新对象,而不是直接通过构造函数来创建。这一...

    设计模式——原型模式

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

    Java设计模式——原型模式

    原型模式Java设计模式——原型模式概念使用场景Java里的克隆代码理解prototype(原型)问题总结优缺点模型优点模型缺点 概念 ​ 原型模式是创建型模式的最后一种,讲到原型模式就不得不提到克隆这个词,克隆这个词...

    C#面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式)

    今天我们将深入探讨其中的一种创建型模式——原型模式(Prototype Pattern)。原型模式主要用于简化实例化过程,通过克隆已有对象来创建新对象,而不是每次都创建全新的实例。在C#中,我们可以通过实现`ICloneable`...

    设计模式——可复用面向对象软件的基础(3)

    《设计模式——可复用面向对象软件的基础》是IT领域中的经典著作,由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师合著,他们因此被誉为GoF(Gang of Four)。这本书提出了面向对象设计的23种...

    iOS设计模式之原型模式

    本文将深入探讨一种常见的设计模式——原型模式(Prototype Pattern),并结合具体的iOS应用场景进行解析。 原型模式是一种创建型设计模式,它的主要思想是通过复制已有对象来创建新对象,而不是通过构造函数来创建...

    设计模式可复用面向对象软件的基础.zip

    3.4 Prototype(原型)—对象创建型 模式 87 3.5 Singleton(单件)—对象创建型 模式 84 3.6 创建型模式的讨论 89 第4章 结构型模式 91 4.1 Adapter(适配器)—类对象结构型 模式 92 4.2 Bridge(桥接)—对象结构...

    设计模式之原型模式

    **原型模式(Prototype Pattern)**是软件设计模式中的结构型模式之一,主要用来简化实例化过程,减少类的创建。在原型模式中,一个对象可以被用作创建其他新对象的模板,通过复制已有对象来创建新对象,而不是通过new...

    23种 设计模式---面向对象的基本原则

    - 原型模式(Prototype):通过复制已有对象来创建新对象。 - 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。 - 抽象工厂模式(Abstract Factory):提供一个创建一...

    Python设计模式之原型模式实例详解

    设计模式——原型模式 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 原型模式是用场景:需要大量的基于某个基础原型进行微量修改而得到新原型时使用 """ fro

    设计模式代码——c#

    C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器...

    设计模式与泡MM——设计模式入门教程

    ### 设计模式与泡MM——设计模式入门教程 #### 一、创建型模式 ##### 1、FACTORY(工厂模式) 工厂模式的核心在于定义了一个创建对象的接口,但允许子类决定实例化哪一个类。工厂模式让类的实例化延迟到子类中...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...

    php设计模式 Prototype (原型模式)代码

    原型模式(Prototype)是设计模式中的一种,属于创建型模式。它提供了一种创建对象的最佳方式,特别是在需要大量创建相似对象时,通过克隆已有对象来创建新对象可以提高效率。在PHP中,我们可以通过实现`__clone()`...

    原型模式实践代码

    原型模式是一种设计模式,主要应用于软件工程领域,用于创建重复的对象,而无需再次进行实例化。在Java、C#等面向对象的语言中,原型模式通过实现`Cloneable`接口或使用序列化机制来实现对象的复制。在这个"原型模式...

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

    **原型模式**(Prototype Pattern)是一种创建型设计模式,它通过复制一个现有的实例来创建新对象,而不是通过传统的构造函数进行创建。这种模式的关键在于利用现有的实例作为模板,通过复制这个模板对象来生成新的...

    X-gen PPT下载——《研磨设计模式》 实战

    1. **创建型模式**:包括单例模式(Singleton)、工厂模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。这些模式关注于对象的创建过程,以确保代码的灵活...

    管理系统javasal源码-Design-Patterns-Demo:超全的设计模式——理论+实现demo

    Pattern)原型模式(Prototype Pattern) 2 结构型模式:这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。 适配器模式(Adapter Pattern)桥接模式(Bridge Pattern)...

Global site tag (gtag.js) - Google Analytics