Prototype模式不通过实例化类来创建一个新的未初始化的实例,而是通过复制一个现有的对象来生成新的对象。
1.作为工厂的原型:
假定Oozinoz公司的应用系统通过使用抽象工厂模式为不同的应用场合提供不同的图形用户界面。如下图列出了所用到的用户接口工厂:
三个抽象工厂(或称工具包)可以产生三种不同的“外观和感觉”的用户界面
Oozinoz公司的应用程序可以为用户在不同的应用场合提供合适的界面。但是当用户提出他们需要更多的用户界面工具包时,该系统存在以下问题:如果分别为用户指定的每种场合都提供一个用户接口工厂类,将会为我们带来繁重的工作量。为了避免用户接口工厂类的不断增加,Oozinoz应用系统开发者建议使用ProtoType模式:
(1)停止使用UIKit子类;
(2)让UIKit类的每个实例成为一个用户接口工厂,可以分发原型控件的副本;
(3)把静态方法中创建UIKit对象的代码放入UIKit类中。
根据这种设计,UIKit对象将拥有完整的原型实例变量集合:一个按钮对象,一个网格对象,一个可滑动面板对象等。创建新UIKit对象的代码也会设置这些原型控件的属性,以便得到期望的界面效果。create-()方法返回这些原型控件的副本。
例如,我们可以在UIKit类中提供静态的handledUI()方法。这个方法会实例化UIKit,设置适合手持设备的对象实例变量,以及返回用作GUI工具集的对象。
突破题:如果使用Prototype模式,Oozinoz应用系统用于维护多个GUI工具集的类的数量会减少。请列出这种设计方法的其他优缺点。
答:优点包括:
(1)可以在不创建新类的前提下创建新工厂;甚至可以在运行时创建一个新的GUI。
(2)我们可以这样创建一个新的GUI工具集,与老工具集的差别只在于字体不同。借助于原型方法,新工厂的按钮和其他控件可以从以前的工厂“继承”值,诸如颜色。
缺点包括:
(1)Prototype模式方法允许我们修改每个工厂的属性值,诸如颜色和字体,但是不允许我们创建具有不同行为的新工具集。
(2)终止UI工具集进一步扩充的原因不清楚;为什么进一步扩充存在问题?我们必须把工具集初始化代码放在建议的UIKit类的静态方法中。这种方法并不能真正减少需要管理的代码的数量。
到底那种答案正确?在类似的情况下,最好进行实验。编写遵循上述两种思路的代码,看看不同设计思路的真实效果如何。有时候,当项目组成员的分歧很大时,就应该采取试验的方式来辅助判断和决策。有时候,你确实拿定主意见了,会求助于架构师、首席设计师或者中立的第三者来做出判断。
创建对象的常规方式是调用类的构造器。Prototype模式则可提供一个灵活的解决方案,让你可以在运行时决定使用哪个对象作为新对象的模板。然而,Java中的原形方法不允许对象拥有与父对象不同的方法。这时候,在使用原型方法之前,需要仔细考虑原型方法的利弊,甚至要试试此模式是否满足需求。为了使用Prototype模式,需要掌握Java语言复制对象的机制。
2.利用克隆进行原型化:
Prototype模式的主要目的是通过复制样本来创建新对象。复制对象时,新对象具备与父对象相同的属性和方法。新对象也许还会从父对象继承部分或者全部的数据值。比如,滑动面板的副本应该具有与原面板相同的滑动属性数据值。
现在需要关注一个重要问题:复制对象时,复制操作会提供原始对象属性值的副本吗?还是副本与原始对象共享这些属性值?必须理解复制的工作机制,尤其是当你想使用Prototype模式时。
突破题:关于clone()方法的使用:
答:clone()方法的功能:新对象,相同的字段。clone()方法创建一个新对象,这个新对象与原对象的类型相同,新对象的属性与原对象的属性也完全相同。如果这些字段的类型是基础类型,如整型,则字段值也会被复制。如果字段是引用,则引用不会被复制。
clone()方法创建的对象是浅复制,与原对象共享任何下级对象。深复制是对所有父对象属性的完全复制。比如,如果克隆一个指向对象B的对象A,浅复制只会创建一个新的A对象,新的A对象指向原来的B对象;深复制会创建新的A对象,新的A指向新的B。如果希望使用深复制,你必须自己实现自己期望的内容复制。
为了使用clone()方法,必须把自己的类声明为implements Cloneable.Cloneable是个标记接口,没有方法,只是充当一个标记来说明你有意支持clone()。
借助于clone()方法,我们很容易往类中添加copy()方法。比如,你可以使用如下代码创建可克隆面板的类:
package com.oozinoz.ui;
import javax.swing.JPanel;
public class OzPanel extends JPanel implements Cloneable
{
//dangerous!
public OzPanel copy()
{
return (OzPanel) this.close();
}
//...
}
上述代码中的copy()方法使得大家都可以使用克隆功能,并且复制对象为所需的类型。这部分代码存的问题是,clone()方法会创建某JPanel对象所有属性的副本,不管你是否理解这些属性的功能。OzPanel类的属性包括它的超类的所有属性。大约70多个。
OzPanel类从Component类继承了大量属性,而这些属性通常是操作GUI对象时需要复制的属性。
突破题:完善copy2()方法,使其能够不使用clone()方法就能实现面板复制。假设对面板来说最重要的属性是backgroud,font和foreground。
答:
public OzPanel copy2()
{
OzPanel result = new OzPanel();
result.setBackGround(this.getBackground());
result.setForeground(this.getForeground());
result.setFont(this.getFont());
return result;
}
copy()方法和copy2()方法使得OzPanel的客户端无需调用构造器,并支持Prototype模式思想。然而,copy2()的人工方法也许更加安全。这个方法知道哪些属性最需要复制,但是避免复制自己不了解的属性。
3.小结:
借助Prototype模式,用户可以通过复制对象样本来创建新的对象。调用构造器创建新对象和复制对象来创建新对象,这两者最大的区别在于,通过复制创建的新对象一般会含有原始对象的某些状态。我们可以充分利用这个特点,尤其是当几个对象的类在属性上仅存在一点差别,而在行为上完全相同的时候。在这种情况下,我们可以通过为用户提供一个可以复制的对象原型,在运行时动态创建新类。
当我们需要复制对象的时候,可以借助Object.clone()方法。但是必须记住,利用该方法创建的新对象与对象原型属性字段是完全相同的。通过这种复制方法获得的新对象可能并不是开发者所期望的副本,而且任何进一步的复制工作都需要由开发者来完成。如果进一步的复制工作过于错综复杂或者对象原型的字段太多,那么我们可以先实例化一个新对象,然后将对象原型中我们需要的字段赋给新对象的对应字段。
- 大小: 2.8 KB
分享到:
相关推荐
在本课程中,我们将深入探讨C#编程中的一个重要设计模式——Prototype原型模式,它是创建型设计模式的一种。原型模式主要用于简化实例化过程,通过复制已有对象来创建新对象,而不是直接通过构造函数来创建。这一...
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均... 这是第6节:Prototype原型模式创建型模式.part1
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均... 这是第6节:Prototype原型模式创建型模式.part2
本篇文章将深入探讨C#中的“原型模式”(Prototype Pattern),这是一种创建型设计模式,它允许我们通过复制已有对象来创建新对象,而不是从零开始创建。 原型模式的核心思想是克隆。在C#中,对象的克隆可以通过...
Java设计模式之Prototype原型模式 Prototype原型模式是Java设计模式中的一种创建型模式,它主要用于对象的克隆和创建。该模式的主要思想是将一个对象作为原型,然后通过克隆该对象来创建新的对象,从而实现对象的...
原型模式(Prototype Pattern)是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而无需知道具体创建过程的细节。在C#中,原型模式是通过接口或抽象类来实现的,通常涉及`ICloneable`接口或者...
- `prototype.pro` 是Qt项目文件,用于编译和构建原型模式的示例。 - `readme.txt` 可能是项目说明文件,包含关于如何运行和理解代码的指导。 - `mainwindow.ui` 是Qt Designer生成的用户界面描述文件,描述了GUI的...
在面向对象编程中,当我们需要频繁地创建具有相同或相似属性的对象时,原型模式可以极大地提高效率。 ### 模式原理 在原型模式中,一个类定义了创建新对象的接口,而其实现由它的子类完成。这个接口通常只有一个...
即原型模式,提供一个已经存在的对象进行新对象创建的接口,一般情况下都是使用Clone接口。 此模式非常简单,简单的说就是复制多个当前对象供使用。Prototype模式允许一个对象再创建另外一个可定制的对象,根本...
**原型模式(Prototype Pattern)**是一种基于克隆的创建型设计模式,它的主要目的是为了提高创建新对象的效率,特别是当创建新对象的过程复杂或者资源消耗较大时。在原型模式中,一个已经创建的对象(称为原型)被...
**原型模式(Prototype Pattern)**是一种创建型设计模式,它提供了一种通过复制已有对象来创建新对象的方式,而不是通过构造函数。在某些情况下,当创建新对象的成本非常高时(例如,对象需要大量的初始化操作或者从...
**原型模式(Prototype Pattern)详解** 在软件设计中,原型模式是一种创建型设计模式,它提供了一种通过复制已有对象来创建新对象的方式,避免了重复的构造过程,提高了代码的效率和可维护性。原型模式的核心思想...
本篇文章将深入探讨“原型模式(Prototype)”这一经典的设计模式,它是面向对象设计的一个重要概念,尤其在C++编程中有着广泛的应用。 原型模式是一种创建型设计模式,它的核心思想是通过复制已有对象来创建新对象,...
原型模式的意图是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 适用性 当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者 为了避免创建一个与产品类层次平行的工厂类层次时;...
**原型模式(Prototype)** 原型模式是一种创建型设计模式,它提供了一种通过复制已有对象来创建新对象的方式,而不是通过传统的构造函数。这种模式在系统中需要创建大量相似对象时特别有用,可以提高效率并减少内存...
**原型模式(Prototype)**是软件设计模式中的一种,它属于创建型模式,主要用于简化对象的创建过程,通过复制已有对象来生成新对象,避免了重复的构造过程,提高了代码的效率和可维护性。在Java、C#等面向对象语言...
原型模式(Prototype)是一种软件设计模式,主要用于简化创建对象的过程,尤其当对象的构造过程复杂时。在C#中,我们可以利用接口或者继承来实现这一模式。本案例将深入探讨如何在C#环境中运用原型模式。 首先,...
原型模式是一种设计模式,主要应用于软件工程领域,用于创建重复的对象,而无需再次进行实例化。在Java、C#等面向对象的语言中,原型模式通过实现`Cloneable`接口或使用序列化机制来实现对象的复制。在这个"原型模式...