浅析设计模式(八)——创建型模式之Prototype(原型模式)

原型模式Prototype

本文的内容:

一、原型模式的定义

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

  使用现有的对象,生成一个完全一样的拷贝(副本,内部属性值一样,而内存地址不一样),但是这个拷贝和原对象不共用任何内部属性元素,即实现了对象的深度克隆。这个“拷贝”的精确含义取决于该对象的类,一般含义是:

  1. 对任何的对象x,都有:x.clone()!=x。换言之,克隆对象与原对象不是同一个对象。
  2. 对任何的对象x,都有:x.clone().getClass() == x.getClass(),换言之,克隆对象与原对象的类型一样。
  3. 如果对象x的equals()方法定义其恰当的话,那么x.clone().equals(x)应当成立的。

二、原型模式的参与者及其角色

1、Prototype

  • 声明一个克隆自身的接口。

2、ConcretePrototype

  • 实现一个克隆自身的操作。

3、Client

  • 让一个原型克隆自身从而创建一个新的对象。

三、原型模式的类图

四、原型模式的示例

  Java中可以使用以下几种方式进行对象的深度克隆:

  1. 实现Cloneable接口,并重写Object类中的clone()方法
  2. 实现序列化哈反序列化实现对象的深度克隆,实现Serializable接口或者Externalizable接口。

下面使用Cloneable进行说明:

1、Prototype

  使用Cloneable接口。

2、ConcretePrototype

  实现一个克隆自身的操作,这里是clone()方法,需要重新进行定义。

 1 public class Name implements Cloneable{
 2     private String firstName;
 3     private String lastName;
 4     private Title title;
 5     //Constructor with no arguments
 6     public Name(){
 7
 8     }
 9     //Constructor with all arguments
10     public Name(String firstName, String lastName, Title title) {
11         super();
12         this.firstName = firstName;
13         this.lastName = lastName;
14         this.title = title;
15     }
16     //all getters and setters
17     public String getFirstName() {
18         return firstName;
19     }
20     public void setFirstName(String firstName) {
21         this.firstName = firstName;
22     }
23     public String getLastName() {
24         return lastName;
25     }
26     public void setLastName(String lastName) {
27         this.lastName = lastName;
28     }
29
30     public Title getTitle() {
31         return title;
32     }
33     public void setTitle(Title title) {
34         this.title = title;
35     }
36     @Override
37     public Name clone() throws CloneNotSupportedException {
38         Name nameClone = (Name)super.clone();
39         nameClone.setFirstName(new String(this.getFirstName()));
40         nameClone.setLastName(new String(this.getLastName()));
41         nameClone.setTitle(this.getTitle().clone());
42         return nameClone;
43     }
44
45 }

  这里要注意的是,若属性中有对象引用,同样需要进行深度克隆,而该属性也同样需要实现Cloneable,重写clone()方法。如上面的Title,如下:

 1 public class Title implements Cloneable{
 2     private String pre;
 3     private String title;
 4     //Constructor with no arguments
 5     public Title(){
 6
 7     }
 8     //Constructor with all arguments
 9     public Title(String pre, String title) {
10         super();
11         this.pre = pre;
12         this.title = title;
13     }
14     public String getPre() {
15         return pre;
16     }
17     public void setPre(String pre) {
18         this.pre = pre;
19     }
20     public String getTitle() {
21         return title;
22     }
23     public void setTitle(String title) {
24         this.title = title;
25     }
26     @Override
27     public Title clone() throws CloneNotSupportedException {
28         Title title = (Title)super.clone();
29         title.setPre(new String(this.getPre()));
30         title.setTitle(new String(this.getTitle()));
31         return title;
32     }
33 }

3、Client

  创建原型对象,然后进行克隆。main方法中进行,输出结果均为false。

 1 public class PrototypeTestApp {
 2     public static void main(String[] args) throws CloneNotSupportedException {
 3         Title title = new Title("Mr", "Doc");
 4         Name name = new Name("San", "Li", title);
 5
 6         Name nameClone = name.clone();
 7
 8         System.out.println(nameClone.getFirstName() == name.getFirstName());
 9         System.out.println(nameClone.getLastName() == name.getLastName());
10         System.out.println(nameClone.getTitle() == name.getTitle());
11         System.out.println(nameClone.getTitle().getPre() == name.getTitle().getPre());
12         System.out.println(nameClone.getTitle().getTitle() == name.getTitle().getTitle());
13     }
14 }

五、参考

1、参考《Head First设计模式》和GoF《设计模式:可复用面向对象软件的基础》

2、代码可参考【github传送门】、UML类图参考【github传送门

原文地址:https://www.cnblogs.com/wpbxin/p/9439559.html

时间: 2024-10-14 07:38:18

浅析设计模式(八)——创建型模式之Prototype(原型模式)的相关文章

设计模式3 创建型模型

设计模式3 创建型模型 目录: 简单工厂模式 工厂方法模式 抽象工厂模式 单例模式 简单工厂 模型 [email protected]:~$ cat main.cpp  //设计模式:简单工厂 模型 #include<iostream> using namespace std; class Fruit { public: Fruit(string kind) { this->kind = kind; if(kind == "apple") {} else if (ki

设计模式(五):PROTOTYPE原型模式 -- 创建型模式

1.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.适用场景 原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是有对象的内部提供克隆的方法,通过该方法返回一个对象的副本,这种创建对象的方式,相比我们之前说的几类创建型模式还是有区别的,之前的讲述的工厂模式与抽象工厂都是通过工厂封装具体的new操作的过程,返回一个新的对象,有的时候我们通过这样的创建工厂创建对象不值得,特别是以下的几个场景的时候,可能使用原型模式更简单也效率更高. • 1)当一个系统应该独立于

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

Prototype 原型模式(创建型模式) 依赖关系的倒置抽象不应该依赖于实现细节,细节应该依赖于抽象.对所有的设计模式都是这样的. -抽象A直接依赖于实现细节b -抽象A依赖于抽象B,实现细节b依赖于抽象B 动机(Motivation) 在软件工程中,经常面临着“某些结构复杂的对象”的创建工作:由于需求变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口. 如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离出这些“易变对象”,从而使得“依赖这些易变对象的客户程序”不

NET设计模式 第二部分 创建型模式(5):原型模式(Prototype Pattern)

原型模式(Prototype Pattern) ——.NET设计模式系列之六 Terrylee,2006年1月 概述 在软件系统中,有时候面临的产品类是动态变化的,而且这个产品类具有一定的等级结构.这时如果用工厂模式,则与产品类等级结构平行的工厂方法类也要随着这种变化而变化,显然不大合适.那么如何封装这种动态的变化?从而使依赖于这些易变对象的客户程序不随着产品类变化? 意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 结构图 Prototype模式结构图 生活中的例子 Pr

&quot;围观&quot;设计模式(10)--创建型之原型模式(Prototype Pattern)

原型模式是创建型模式的一种,其特点在于通过"复制"一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的"原型",这个原型是可定制的. 原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效:或者创建值相等,只是命名不一样的同类数据.----WIKIPEDIA 首先看下面这样的一个例子,使用本人自黑一下,实现Clonable接口然后实现它的clone的方法,然后通过该方法对这个对象进行克隆.看是不是像我们

设计模式之创建型模式(上)

没有总结的学习不算学习,这一个月的学习可谓收获多多啊,接下来与大家分享一下. 一.设计模式的分类 总体来说设计模式分为三大类: 1.创建型模式,共五种. 2.结构型模式,共七种. 3.行为型模式,共十一种. 首先研究创建型模式 二. 概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统独 立于如何创建.组合和表示它的那些对象. 三. 为什么需要创建型模式 所有的创建型模式都有两个永恒的主旋律: 第一,它们都将系统使用哪些具体类的信息封装起来: 第二,它们隐藏了这些类的实例

设计模式之创建型模式

一.前言 设计模式应该是在软件工程的背景下进行讨论的,而不是为了设计模式而论设计模式.设计模式是软件工程面向对象设计工作中一个抽象.归纳.总结的过程.软件设计的最高目标和最高准则就是易扩展,易复用,易维护, 灵活性高,高可用,稳定性高一切的设计原则和设计模式最终的目标都是向这个目标靠拢的. 二.面向对象设计六大原则 任何的设计模式都是基于面向对象的特性(抽象.封装.继承.多态)和设计原则进行设计和实现的,是面向对象设计原则的在不同场景下的实现方案. 抽象:抽离变化的部分,引入抽象层,实现具体实现

设计模式 (创建型模式)

  设计模式 创建型模式 1.创建型模式         创建型模式,包括了5种设计模式,分别是 Singleton (单例模式),Factory(工厂模式),AbstractFactory(抽象工厂模式),Builder(创建者),Prototype(原型) ,创建型模式主要作用就是抽象了实例化过程.他们帮助一个系统独立于如何创建.组合和表示他的那些对象.一个类创建型模式使用继承改变被实例化的类.而一个对象创建型模式将实例化委托给另一个对象. 2.Singleton (单例模式)      单

设计模式系列 - 创建型模式

单例模式 懒汉式,线程不安全. 除非是单线程程序,否则不推荐使用. public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 饿汉式,线程安全 当程序总是使用这个