设计模式--原型模式-sj

31 篇文章 0 订阅

什么是原型模式

原型模式是通过给出一个原型对象来指明所创建的对象的类型,然后使用自身实现的克隆接口来复制这个原型对象,该模式就是用这种方式来创建出更多同类型的对象

为什么用

使用这种方式创建新的对象的话,就无需再通过 new 实例化来创建对象了。这是因为 Object 类的 clone 方法是一个本地方法, 它可以直接操作内存中的二进制流,所以性能相对 new 实例化来说,更佳。

什么场景可以用

for循环中创建对象,尤其是大对象。

举个栗子

// 定义学生类
class Student implements Cloneable{  
    private String name; // 学生姓名
    private Teacher teacher; // 定义老师类
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    } 
 
    public Teacher getTeacher() {  
        return teacher;  
    }  
  
    public void setName(Teacher teacher) {  
        this.teacher = teacher;  
    } 
   // 重写克隆方法
    public Student clone() { 
        Student student = null; 
        try { 
            student = (Student) super.clone(); 
            Teacher teacher = this.teacher.clone();// 克隆 teacher 对象
            student.setTeacher(teacher);
            } catch (CloneNotSupportedException e) { 
            e.printStackTrace(); 
            } 
            return student; 
   } 
 
}  
 
// 定义老师类
class Teacher implements Cloneable{  
    private String name;  // 老师姓名
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name= name;  
    } 
 
   // 重写克隆方法,堆老师类进行克隆
   public Teacher clone() { 
        Teacher teacher= null; 
        try { 
            teacher= (Teacher) super.clone(); 
            } catch (CloneNotSupportedException e) { 
            e.printStackTrace(); 
            } 
            return student; 
   } 
      
}
public class Test {  
      
    public static void main(String args[]) {
        Teacher teacher = new Teacher (); // 定义老师 1
        teacher.setName(" 刘老师 ");
        Student stu1 = new Student();  // 定义学生 1
        stu1.setName("test1");           
        stu1.setTeacher(teacher);
        
        Student stu2 = stu1.clone(); // 定义学生 2
        stu2.setName("test2");  
        stu2.getTeacher().setName(" 王老师 ");// 修改老师
        System.out.println(" 学生 " + stu1.getName + " 的老师是:" + stu1.getTeacher().getName);  
        System.out.println(" 学生 " + stu1.getName + " 的老师是:" + stu2.getTeacher().getName);  
    }  
}

慢策略

for(int i=0; i<list.size(); i++){
  Student stu = new Student(); 
  
}

Student stu = new Student(); 
for(int i=0; i<list.size(); i++){
 Student stu1 = (Student)stu.clone();
  ...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值