设计模式--创建模式--原型模式

一、基本概念

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

2、角色:

A、抽象原型(Prototype)角色:此角色定义了的具体原型类所需的实现的方法,本例子直接精简为类。

B、客户(Client)角色:客户类提出创建对象的请求;也就是我们用户使用复制粘贴的功能。

3、其实原型模式的核心就是Prototype(抽象原型),他需要继承Cloneable接口,并且重写Object类中的clone方法即可。

二、简单例子

A、抽象原型(Prototype)角色:

 1 package comm.pattern.create.prototype;
 2
 3 import java.util.HashMap;
 4 import java.util.Map.Entry;
 5
 6 /**
 7  *
 8  * @Title: ProtoTypeClass.java
 9  * @Package: comm.pattern.create.prototype
10  * @Description: 描述该文件做什么
11  * @author yangzhancheng
12  * @2020年3月25日:下午10:27:15
13  *
14  */
15 public class PersonProtoType implements Cloneable {
16
17     // 年龄
18     private int age;
19
20     // 姓名
21     private String name;
22
23     // 朋友链
24     private HashMap<String, String> FriendsName = new HashMap<String, String>();
25
26     // 朋友链
27     private HashMap<String, PersonProtoType> Friends = new HashMap<String, PersonProtoType>();
28
29     public int getAge() {
30         return age;
31     }
32
33     public void setAge(int age) {
34         this.age = age;
35     }
36
37     public String getName() {
38         return name;
39     }
40
41     public void setName(String name) {
42         this.name = name;
43     }
44
45     public HashMap<String, String> getFriendsName() {
46         return FriendsName;
47     }
48
49     public void setFriendsName(HashMap<String, String> friendsName) {
50         FriendsName = friendsName;
51     }
52
53     public HashMap<String, PersonProtoType> getFriends() {
54         return Friends;
55     }
56
57     public void setFriends(HashMap<String, PersonProtoType> friends) {
58         Friends = friends;
59     }
60
61     @Override
62     public PersonProtoType clone() {
63         PersonProtoType clone = null;
64         try {
65             clone = (PersonProtoType)super.clone();
66         } catch (CloneNotSupportedException e) {
67             e.printStackTrace();
68         }
69         return clone;
70     }
71
72     // 返回字符串
73     @Override
74     public String toString() {
75         StringBuffer strbuff = new StringBuffer();
76         strbuff.append("name:" + this.name);
77         strbuff.append(",age:" + this.age);
78
79         for (Entry<String, String> entry : this.FriendsName.entrySet()) {
80             String columnName = entry.getKey();
81             String value = entry.getValue();
82             strbuff.append("\n第" + columnName + "个朋友;" + value);
83         }
84
85         return strbuff.toString();
86     }
87 }

B、客户(Client)角色:

 1 package comm.pattern.create.prototype;
 2
 3 import java.util.HashMap;
 4
 5 /**
 6  *
 7  * @Title: Client.java
 8  * @Package: comm.pattern.create.prototype
 9  * @Description: 描述该文件做什么
10  * @author yangzhancheng
11  * @2020年3月25日:下午10:34:05
12  *
13  */
14 public class Client {
15
16     public static void main(String[] args) {
17
18         PersonProtoType person = new PersonProtoType();
19         person.setAge(24);
20         person.setName("丽丽");
21         HashMap<String, String> friendsName = new HashMap<String, String>();
22         friendsName.put("1", "小马");
23         friendsName.put("2", "小李");
24         person.setFriendsName(friendsName);
25         System.out.println("输出原来人物:\n"+person.toString());
26
27         //克隆
28         System.out.println("---------------------------------------");
29         PersonProtoType coppyperson = person.clone();
30         System.out.println("输出复制人物:\n"+coppyperson.toString());
31
32     }
33
34 }

运行结果

输出原来人物:
name:丽丽,age:24
第1个朋友;小马
第2个朋友;小李
---------------------------------------
输出复制人物:
name:丽丽,age:24
第1个朋友;小马
第2个朋友;小李

三、总结

注意:java执行clone方法的时候是直接从内存中去获取数据的,在第一次创建对象的时候就会把数据在内存保留一份,克隆的时候直接调用就好了,因此不初始化构造方法。

原文地址:https://www.cnblogs.com/fating/p/12571651.html

时间: 2024-11-14 13:06:37

设计模式--创建模式--原型模式的相关文章

设计模式-创建型-原型模式

引言: 原型模式是什么?它是在什么场景下被提出的呢?本章节,我们将详细了解下原型模式. 在软件系统中,当创建一个类的实例过程过于昂贵或复杂,并且我们需要创建多个这样类的实例时,如果我们通过new来创建类实例,这就会增加创建类的复杂度和创建过程与客户代码复杂的耦合度.如果采用工厂模式来创建这样的实例对象的话,随着产品类的不断增加,导致子类的数量不断增多,也导致了相应工厂类的增加,维护的代码维度增加了,因为有产品和工厂两个维度了,反而增加了系统复杂程度,所以在这里使用工厂模式来封装类创建过程并不合适

设计模式学习05—原型模式

一.动机与定义 之前学习原型模式一直以为原型模式目的是为了方便的创建相同或相似对象,用复制对象的方式替换new的方式,还研究了深克隆和浅克隆.最近仔细看了GOF的设计模式,发现原型模式的本意并不仅仅是复制对象这么简单. 复制对象确实是一方面,当我们需要大量相似,甚至相同对象的时候,除了一个个的new之外,还可以根据一个原型,直接复制出更多的对象.但是如果把原型模式认为只是复制对象这么简单就错了. 创建型模式主要讲如何创建对象,通常包含何时创建,谁来创建,怎么创建等.GOF书里面写的意图是,用原型

Java描述设计模式(05):原型模式

一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. 2.模式结构 原型模式要求对象实现一个可以"克隆"自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例.这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新的对象,而无须再去通过new来创建. 3.代码实现 1).UML关系图 Java描述设计模

从王者荣耀看设计模式(十七.原型模式)

从王者荣耀看设计模式(原型模式) 一.简介 王者荣耀包含有很多的玩法,其中有一种游戏模式只在周六和周日开放,那就是--克隆模式.与常规的游戏双方阵营只允许出现单一英雄不同,在克隆模式中,双方各选择一个英雄进行克隆,换句话说,一个阵营的五个人操作的五个相同的英雄 二.模式动机 在软件系统中,有些对象的创建过程比较复杂,而且有时候需要频繁创建,原型模式通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的意图所在. 三.原型模式 原型模式

创建型—原型模式

1.原型模式意图: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.场景描述: 原型模式,利用实例自身的克隆功能来得到与原实例相同的新的实例. 设想西游记中的一个场景,唐僧师徒四人(白龙马除外),不过,该唐僧是个多事.喜欢使唤徒弟的唐僧.每当有事时,唐僧便会使唤他的三个徒弟去做.但是三个徒弟尽职尽责,为了保护师傅,必须留在唐僧身边.此时,多亏了三个徒弟能够千变万化,且都可通过毛发来变作自身(八戒.沙僧不知是否具有此功能?暂时看做有吧).当唐僧需要洗衣.化斋.喝水.探路.借宿

【大话设计模式读书笔记——原型模式】

原型模式 原型模式是创建型模式的一种,其特点在于通过"复制"一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的"原型",这个原型是可定制的. 原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效:或者创建值相等,只是命名不一样的同类数据. /// <summary> /// 简历类 /// </summary> public class Resume : ICloneable

java设计模式--创建模式--原型模式

原型模式: 1 原型模式 2 概述 3 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 4 5 适用性 6 1.当一个系统应该独立于它的产品创建.构成和表示时. 7 8 2.当要实例化的类是在运行时刻指定时,例如,通过动态装载. 9 10 3.为了避免创建一个与产品类层次平行的工厂类层次时. 11 12 4.当一个类的实例只能有几个不同状态组合中的一种时. 13 14 建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些. 15 16 参与者 17 1.

php设计模式 四 (观察者 原型模式 迭代器模式)

观察者模式 观察者模式(有时又被称为发布-订阅Subscribe>模式.模型-视图View>模式.源-收听者Listener>模式或从属者模式)是软件设计模式的一种.在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.此种模式通常被用来实现事件处理系统. 当一个对象的状态发生改变时,依赖他的对象全部会接到通知,并自动更新.观察者模式实现了低耦合 非入侵式的通知与更新机制. 观察者模式示例: 首先创建一个事

《Java设计模式》之原型模式

原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象.这就是原型模式的用意. 原型模式的结构 原型模式要求对象实现一个可以"克隆"自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例.这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新的对象,而无须再去通过new来创建. 原型模式有两种表现形式:(1)简单形式.(2)登记形式,这两