原型模式 prototype-阿里云开发者社区

开发者社区> 陈嘻嘻哈哈> 正文

原型模式 prototype

简介: 1 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节 2 实现方式:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
+关注继续查看
1 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节
2 实现方式:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
3 使用情况:很多时候,创建对象的时候,只是在某些属性值上有区别,而大部分都很相似,该类的用户对于该类的对象是怎么创建的,对类的内部结构这些都不关心的情况,但是这样的对象的初始化相对来说比较复杂,      而且需要耗费较长的时间或资源,这种情况下,我们可以考虑使用Prototype模式。
4 原型模式 prototype-(浅度克隆):浅克隆是指克隆一个对象,而该对象的属性只是基本数据类型,只克隆出该对象!
eg:
 1 package com.lovo.prototype.two;
 2 public class Player implements Cloneable {
 3 
 4     private int id;
 5     private String name;
 6     private String skill;
 7 
 8     public int getId() {
 9         return id;
10     }
11     public void setId(int id) {
12         this.id = id;
13     }
14     public String getName() {
15         return name;
16     }
17     public void setName(String name) {
18         this.name = name;
19     }
20     public String getSkill() {
21         return skill;
22     }
23     public void setSkill(String skill) {
24         this.skill = skill;
25     }
26     
27     
28 @Override
29     public String toString() {
30         return "Player [id=" + id + ", name=" + name + ", skill=" + skill + "]";
31     }
32     
33     /**
34      * 浅克隆
35      * @return
36      * @throws CloneNotSupportedException
37      */
38     public Player qianClone() throws CloneNotSupportedException{
39         return (Player) super.clone();
40     }
41     
42     
43     
44     
45 
46 }

 

 1 package com.lovo.prototype.two;
 2 
 3 public class Test {
 4 
 5     public static void main(String[] args) throws CloneNotSupportedException {
 6         Player p=new Player();
 7         p.setId(1);
 8         p.setName("小明");
 9         p.setSkill("灌篮");
10         
11         Player p2=p.qianClone();
12         
13         System.out.println(p);
14         System.out.println("=============");
15         System.out.println(p2);
16         System.out.println(p==p2);//fasle
17         
18     }
19 
20 }

 

 
5 原型模式 prototype-(深度克隆):深度克隆是指克隆的目标里面还有引用类型,引用类型里还有引用类型,同时把引用类型克隆出来叫深度克隆!
 
 1 package com.lovo.prototype.two;
 2 
 3 import java.io.ByteArrayInputStream;
 4 import java.io.ByteArrayOutputStream;
 5 import java.io.IOException;
 6 import java.io.ObjectInputStream;
 7 import java.io.ObjectOutputStream;
 8 import java.io.Serializable;
 9 import java.util.List;
10 
11 
12 
13 public class Player implements Cloneable,Serializable {
14     private static final long serialVersionUID = 1L;
15     private int id;
16     private String name;
17     private String skill;
18     private List<String> list;
19     
20     public List<String> getList() {
21         return list;
22     }
23     public void setList(List<String> list) {
24         this.list = list;
25     }
26     public int getId() {
27         return id;
28     }
29     public void setId(int id) {
30         this.id = id;
31     }
32     public String getName() {
33         return name;
34     }
35     public void setName(String name) {
36         this.name = name;
37     }
38     public String getSkill() {
39         return skill;
40     }
41     public void setSkill(String skill) {
42         this.skill = skill;
43     }
44     
45     @Override
46     public String toString() {
47         return "Player [id=" + id + ", name=" + name + ", skill=" + skill
48                 + ", list=" + list + "]";
49     }
50     
51     
52     /**
53      * 深克隆
54      * @return
55      * @throws IOException
56      * @throws ClassNotFoundException
57      */
58     public Player deepClone() throws IOException, ClassNotFoundException{
59         ByteArrayOutputStream bos=new ByteArrayOutputStream();
60         ObjectOutputStream oos=new ObjectOutputStream(bos);
61         oos.writeObject(this);
62         
63         ByteArrayInputStream bis=new ByteArrayInputStream(bos.toByteArray());
64         ObjectInputStream ois=new ObjectInputStream(bis);
65         Player p=(Player) ois.readObject();
66         
67         
68         
69         
70         return p;
71         
72     }
73     
74 
75 }

 

 1 package com.lovo.prototype.two;
 2 
 3 import java.io.IOException;
 4 import java.util.ArrayList;
 5 import java.util.List;
 6 
 7 public class Test {
 8 
 9     public static void main(String[] args) throws CloneNotSupportedException, ClassNotFoundException, IOException  {
10         Player p=new Player();
11         p.setId(1);
12         p.setName("小明明");
13         p.setSkill("灌篮");
14         
15         Player p2=p.deepClone();
16         List<String> list=new ArrayList<>();
17         list.add("跑步");
18         list.add("射击");
19         p2.setList(list);
20           
21         
22         System.out.println(p);
23         System.out.println("=============");
24         System.out.println(p2);
25         
26     }
27 
28 }

 

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10095 0
JAVA设计模式(05):创建型-原型模式(Prototype)
转自:http://blog.csdn.net/lovesomnus/article/details/23755505
11 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10886 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
11819 0
C#设计模式(6)——原型模式(Prototype Pattern)
原文:C#设计模式(6)——原型模式(Prototype Pattern) 一、引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在内存中分配了多个一样的...
822 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
7365 0
温故而知新:设计模式之原型模式(Prototype)
原型模式个人以为最适合的场景:参照现有的某一个对象实例,快速得到多个完整的实例副本。(通常是深拷贝的副本) 深拷贝在c#中实现的最简单方式莫过于通过反序列化得到一个全新的对象实例。(当然如果浅拷贝的话,方法就很多了,比如利用MemberwiseClone或反射属性自动赋值都可以) 场景:还是游戏场景,就拿三国来说吧,打仗时可能需要小兵若干,每个小兵可能还要骑马.
663 0
+关注
陈嘻嘻哈哈
我是一个小小的程序媛!
241
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载