zoukankan      html  css  js  c++  java
  • 原型模式 prototype

    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 }
     
  • 相关阅读:
    Java中的Set List HashSet互转
    Java数组如何转为List集合
    Map
    Jave中的日期
    mybatis plus 条件构造器queryWrapper学习
    Error running 'JeecgSystemApplication': Command line is too long. Shorten command line for JeecgSystemApplication or also for Spring Boot default configuration.
    RBAC权限系统分析、设计与实现
    html拼接时onclick事件传递json对象
    PostgreSQL 大小写问题 一键修改表名、字段名为小写 阅读模式
    openssl创建的自签名证书,使用自签发证书--指定使用多域名、泛域名及直接使用IP地址
  • 原文地址:https://www.cnblogs.com/hellokitty1/p/4643989.html
Copyright © 2011-2022 走看看