经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
原型模式(四)
来源:cnblogs  作者:IT小学僧  时间:2021/6/7 9:13:30  对本文有异议

基本介绍

  1. 原型模式(Prototype模式)是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象。
  2. 原型模式是一种创建型设计模式,允许一个对象再创建另一个可定制的对象,无需知道创建的细节
  3. 工作原理是:通过将一个原型对象传给那个发动创建的对象,这个发动创建的对象通过请求原型对象拷贝她们自己来实施创建,即对象clone()

代码

  1. public class Sheep implements Cloneable {
  2. private String name;
  3. private int age;
  4. private String color;
  5. public Sheep(String name,int age,String color){
  6. this.name = name;
  7. this.age = age;
  8. this.color = color;
  9. }
  10. public String getName() {
  11. return name;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. public int getAge() {
  17. return age;
  18. }
  19. public void setAge(int age) {
  20. this.age = age;
  21. }
  22. public String getColor() {
  23. return color;
  24. }
  25. public void setColor(String color) {
  26. this.color = color;
  27. }
  28. @Override
  29. protected Object clone() {
  30. Sheep sheep = null;
  31. try {
  32. sheep = (Sheep) super.clone();
  33. } catch (CloneNotSupportedException e) {
  34. e.printStackTrace();
  35. }
  36. return sheep;
  37. }
  38. }

在spring框架的应用

1、beans.xml

  1. <bean id="id01" class="com.atguigu.spring.bean.Monster" scope="prototype" />

2、Test.java

  1. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
  2. Object bean = applicationContext.getBean("id01");
  3. System.out("bean"+bean);

浅拷贝介绍

  1. 对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值的传递,也就是属性值复制一份给新的对象。

  2. 对于数据类型是引用数据类型的成员变量,比如说成员变量是某个数组,某个类的对象等,那么浅拷贝会进行引用传递,也就是只是该成员变量的引用值(内存地址)复制一份给新的对象,因为实际上两个对象的该成员变量都指向同一个实例,在这个情况下,在一个对象中修改成员变量会影响到另一个对象的该成员变量值

  3. 浅拷贝是使用,默认的clone()方法来实现。

    1. public class Person implements Cloneable{
    2. public String pname;
    3. public int page;
    4. public Address address;
    5. public Person() {}
    6. public Person(String pname,int page){
    7. this.pname = pname;
    8. this.page = page;
    9. this.address = new Address();
    10. }
    11. @Override
    12. protected Object clone() throws CloneNotSupportedException {
    13. return super.clone();
    14. }
    15. public void setAddress(String provices,String city ){
    16. address.setAddress(provices, city);
    17. }
    18. public void display(String name){
    19. System.out.println(name+":"+"pname=" + pname + ", page=" + page +","+ address);
    20. }
    21. public String getPname() {
    22. return pname;
    23. }
    24. public void setPname(String pname) {
    25. this.pname = pname;
    26. }
    27. public int getPage() {
    28. return page;
    29. }
    30. public void setPage(int page) {
    31. this.page = page;
    32. }
    33. }

深拷贝介绍

  1. 复制对象的所有基本数据类型的成员变量值

  2. 为所有引用数据类型的成员变量中申请存储空间,并复制每个引用数据类型成员变量所引用的对象,直到该对象可达到的所有对象,也就是说,对象进行深拷贝要对整个对象进行拷贝

  3. 深拷贝实现方式1:重写clone方法来实现深拷贝

    1. public class Address implements Cloneable{
    2. private String provices;
    3. private String city;
    4. public void setAddress(String provices,String city){
    5. this.provices = provices;
    6. this.city = city;
    7. }
    8. @Override
    9. public String toString() {
    10. return "Address [provices=" + provices + ", city=" + city + "]";
    11. }
    12. @Override
    13. protected Object clone() throws CloneNotSupportedException {
    14. return super.clone();
    15. }
    16. }

    Person.class 的 clone() 方法:

    1. @Override
    2. protected Object clone() throws CloneNotSupportedException {
    3. Person p = (Person) super.clone();
    4. p.address = (Address) address.clone();
    5. return p;
    6. }
  4. 深拷贝实现方式2:通过对象序列化实现深拷贝

    1. //深度拷贝
    2. public Object deepClone() throws Exception{
    3. // 序列化
    4. ByteArrayOutputStream bos = new ByteArrayOutputStream();
    5. ObjectOutputStream oos = new ObjectOutputStream(bos);
    6. oos.writeObject(this);
    7. // 反序列化
    8. ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
    9. ObjectInputStream ois = new ObjectInputStream(bis);
    10. return ois.readObject();
    11. }

原文链接:http://www.cnblogs.com/It-smallstudent/p/14788028.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号