zoukankan      html  css  js  c++  java
  • 设计模式-原型模式(Prototype)

    原型模式是一种对象创建型模式,它采用复制原型对象的方法来创建对象的实例。它创建的实例,具有与原型一样的数据结构和值

    分为深度克隆浅度克隆

    浅度克隆:克隆对象的值类型(基本数据类型),克隆引用类型的地址;

    深度克隆:克隆对象的值类型,引用类型的对象也复制一份副本。

    UML图:

    具体代码:

    浅度复制:

    import java.util.List;
    
    /**
     * 浅度复制
     */
    public class ShallowPerson implements Cloneable{
        private String name;
        private List<String> friendNames;
    
        public List<String> getFriendNames() {
            return friendNames;
        }
    
        public void setFriendNames(List<String> friendNames) {
            this.friendNames = friendNames;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        protected ShallowPerson clone() throws CloneNotSupportedException {
            ShallowPerson person = (ShallowPerson)super.clone();
            return person;
        }
    }
    import java.util.ArrayList;
    import java.util.List;
    
    public class ShallowMain {
        public static void main(String[] args) throws CloneNotSupportedException {
            List<String> list = new ArrayList<String>();
            list.add("小明");
            list.add("小红");
    
            //浅度复制:只复制对象中的属性。对象中的对象,只复制地址
            ShallowPerson shallowPerson = new ShallowPerson();
            shallowPerson.setName("张三");
            shallowPerson.setFriendNames(list);
            ShallowPerson cloneShallowPerson = shallowPerson.clone();//浅度复制
    
            System.out.println(shallowPerson.getName());
            System.out.println(shallowPerson.getFriendNames());
            System.out.println(cloneShallowPerson.getName());
            System.out.println(cloneShallowPerson.getFriendNames());
            System.out.println("--------------------------------------------");
    
            list.add("小兰");
            System.out.println(shallowPerson.getName());
            System.out.println(shallowPerson.getFriendNames());
            System.out.println(cloneShallowPerson.getName());
            System.out.println(cloneShallowPerson.getFriendNames());
        }
    }

    结果:

    张三
    [小明, 小红]
    张三
    [小明, 小红]
    --------------------------------------------
    张三
    [小明, 小红, 小兰]
    张三
    [小明, 小红, 小兰]

    深度复制:

    import java.util.ArrayList;
    import java.util.List;
    
    public class DepthPerson implements Cloneable{
        private String name;
        private List<String> friendNames;
    
        public List<String> getFriendNames() {
            return friendNames;
        }
    
        public void setFriendNames(List<String> friendNames) {
            this.friendNames = friendNames;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        protected DepthPerson clone() throws CloneNotSupportedException {
            List<String> list = new ArrayList<String>();
            DepthPerson person = (DepthPerson)super.clone();
            for(String frientName :this.getFriendNames()){
                list.add(frientName);
            }
            person.setFriendNames(list);
            return person;
        }
    }
    import java.util.ArrayList;
    import java.util.List;
    
    public class DepthMain {
        public static void main(String[] args) throws CloneNotSupportedException {
            List<String> list = new ArrayList<String>();
            list.add("小明");
            list.add("小红");
    
            //深度复制:对象中的属性和对象中的对象都复制
            DepthPerson depthPerson = new DepthPerson();
            depthPerson.setName("张三");
            depthPerson.setFriendNames(list);
            DepthPerson cloneDepthPerson = depthPerson.clone();//深度复制
    
            System.out.println(depthPerson.getName());
            System.out.println(depthPerson.getFriendNames());
            System.out.println(cloneDepthPerson.getName());
            System.out.println(cloneDepthPerson.getFriendNames());
            System.out.println("--------------------------------------------");
    
            list.add("小兰");
            System.out.println(depthPerson.getName());
            System.out.println(depthPerson.getFriendNames());
            System.out.println(cloneDepthPerson.getName());
            System.out.println(cloneDepthPerson.getFriendNames());
        }
    }

    结果:

    张三
    [小明, 小红]
    张三
    [小明, 小红]
    --------------------------------------------
    张三
    [小明, 小红, 小兰]
    张三
    [小明, 小红]

    应用场景:

    1.创建对象的时候,我们不只希望被创建的对象继承其基类的基本结构,还希望继承原型对象的数据。

    2.希望对目标对象的修改不影响既有的原型对象(深度克隆的时候可以完全互不影响)

     源码地址:https://github.com/qjm201000/design_pattern_prototype.git

  • 相关阅读:
    sql语句左链接left join--3张表关联
    combobox下拉框
    sql in()批量操作
    spring事务传播特性实验(2):PROPAGATION_REQUIRED实验结果与分析
    【kubernetes】kubectl logs connection refused
    k8s1.4.3安装实践记录(3)下载基础镜像
    k8s1.4.3安装实践记录(2)-k8s安装
    k8s1.4.3安装实践记录(1)-etcd、docker、flannel安装配置
    python爬虫常用数据整理函数
    django-xadmin常用内容记录
  • 原文地址:https://www.cnblogs.com/qjm201000/p/10058111.html
Copyright © 2011-2022 走看看