zoukankan      html  css  js  c++  java
  • 第六讲:原型模式

    两个对象person1和person2,如果他们只有名字不同,其他属性相同,不想重复创建对象,想把person1复制一份作为person2,可以使用原型模式.

    如果person2克隆person1,那么具有相同的值,修改的话只需要修改Name这一个属性就行.其他的属性都不用设置了,因为都是从person1那里拷贝过来的.现在需要想方设法让person1调用一个方法获得person2这个对象.


    public class Person implements Cloneable{//实现了Cloneable接口才可以被克隆.

    引用的话P1和P2指向的是一个对象,引用的是一个对象,它们引用的地址是相同的.

    Person1和Person2的数据是完全相同的.


    克隆是Person1和Person2是两个不同的对象,只不过这两个不同的对象具有相同的数据.克隆不是简单的引用同一个对象,而是两个不同的对象,修改person1对person2没有任何影响.

    原型就是原始模型.


    Cloneable是一个简单的接口,就是一个声明一样的东西,它里面没有任何东西,只是给虚拟机看的,表面你这个对象是可以克隆的.


    Person里面的数据都是数值型的:String和int.String可以看做是对象,但是因为String是在常量池的,是一个常量,所以String可以看做是常量.int和String都是数值型的.


     如果是引用的话,就不是这样考虑了.

    它只会把引用复制一份,不会把实际的List复制一份.


    浅度的克隆:

    浅度的克隆:复制引用不复制对象,它们两个还是指向同一个对象.person1的List《String>改变了person2的List<String>也会改变.person1的数值型的属性例如name改变,person2的对应属性不会改变.


    深度克隆:不是以前简单的引用传递.

    如果引用型属性不是List数组,而是一个Object对象,又是一个Person的话,就调用那个对象的clone()方法克隆一个新的对象.


    应用场景:

    深度克隆是绝对的互不影响,但是浅度克隆的话引用型的属性就会相互影响了.


    import java.util.ArrayList;
    import java.util.List;
    
    
    public class MainClass {
        public static void main(String[] args) {
    /*        Person person1 = new Person();
            person1.setName("lifengxing");
            person1.setAge(30);
            person1.setSex("男");*/
            
            /*Person person2 = new Person();
            person2.setName("beifeng");
            person2.setAge(30);
            person2.setSex("男");*/
            //Person person2   = person1;//引用.
            //Person person2 = person1.clone();//克隆不同于引用
    /*        person1.setName("厉风行");
            System.out.println(person2.getName());*/
    /*        System.out.println(person1.getName());
            System.out.println(person1.getAge());
            System.out.println(person1.getSex());
            
            System.out.println(person2.getName());
            System.out.println(person2.getAge());
            System.out.println(person2.getSex());*/
            Person person1 = new Person();
            List<String> friends = new  ArrayList<String>();
            friends.add("James");
            friends.add("Yao");
            
            person1.setFriends(friends);
            Person person2 = person1.clone();
            
            System.out.println(person1.getFriends());
            System.out.println(person2.getFriends());
            
            friends.add("Mike");
            person1.setFriends(friends);
            System.out.println(person1.getFriends());
            System.out.println(person2.getFriends());
        }
    }
    import java.util.ArrayList;
    import java.util.List;
    
    
    //public class Person {
    public class Person implements Cloneable{//实现了Cloneable接口才可以被克隆.
    //姓名
        private String name;
        //年龄
        private int age;
        //性别
        private String sex;
        //朋友
        private List<String> friends;//对象,不是保存为数值,而是引用,引用了一个对象.
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public String getSex() {
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
        public Person clone(){//创建一个克隆的方法.
            try {
                Person person = (Person) super.clone();
                //List<String> friends = this.getFriends();//把list手动复制一份
                List<String> friends = new ArrayList<String>();//把list手动复制一份
                for (String friend : this.getFriends()) {
                    friends.add(friend);
                }
                person.setFriends(friends);
                //return (Person) super.clone();//调用它的父类Object的clone()方法.
                return person;
                //利用java的特性可以进行克隆
            } catch (CloneNotSupportedException e) {//没有实现Cloneable接口的话不支持克隆
                // TODO Auto-generated catch block
                e.printStackTrace();
                return null;
            }
        }
        public List<String> getFriends() {
            return friends;
        }
        public void setFriends(List<String> friends) {
            this.friends = friends;
        }
        
    }
  • 相关阅读:

    快排
    排序算法
    运算符
    二叉树
    递归
    队列
    栈(没写完)
    绘制双坐标轴的图形3-不同的plot类型
    绘制双坐标轴的图形2-不同的plot类型
  • 原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/6757520.html
Copyright © 2011-2022 走看看