zoukankan      html  css  js  c++  java
  • Java设计模式之原型模式

    一、什么是原型模式

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

    二、原型的特点

    1.由原型对象自身创建目标对象。也就是说对象的创建这一动作发自原型对象本身。

    2。目标对象是原型对象的一个克隆。也就是说通过prototype模式创建的对象。不仅与原型对象具有同样的结构,还与原型对象具有相同的值。

    3.根据对象克隆深度层次的不同,有浅度克隆和深度克隆之分。

    三、原型对象的应用场景

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

    系统目标对象的修改不影响原型对象。

    隐藏克隆操作的细节,很多时候,对对象本身的克隆需要涉及到类本身的数据细节。

    四、实现

    Person类

    import java.util.ArrayList;
    import java.util.List;
    /*
    *原型必须实现Cloneable接口
    */
    public class Person implements Cloneable{
        // 姓名
        private String name;
        // 年龄
        private int age;
        // 性别
        private String sex;
        //朋友
        private List<String> friends;
    
        public List<String> getFriends() {
            return friends;
        }
    
        public void setFriends(List<String> friends) {
            this.friends = 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> newfriends = new ArrayList<String>();
                for(String friend : this.getFriends()) {
                    newfriends.add(friend);
                }
                person.setFriends(newfriends);
                return  person;
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
                return null;
            }
        }
    
    }

    测试类

    import java.util.ArrayList;
    import java.util.List;
    
    
    public class MainClass {
        public static void main(String[] args) {
        
            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());
        }
    }

     

     

     

     

  • 相关阅读:
    5种排序算法
    Numpy 基础
    Git 帮助
    SpringBoot巧用 @Async 提升API接口并发能力
    延时队列实现的方式总结
    Spring Boot 进行优雅的字段校验
    分布式搜索引擎Elasticsearch的架构分析
    Redis 使用规范
    Intellij IDEA远程debug线上项目记录
    领域驱动设计:领域接口化设计
  • 原文地址:https://www.cnblogs.com/LT0314/p/3896560.html
Copyright © 2011-2022 走看看