首页 > 其他 > 详细

GOF23设计模式之原型模式

时间:2019-03-09 17:25:18      阅读:169      评论:0      收藏:0      [点我收藏+]

GOF23设计模式之原型模式

1)通过 new 产生一个对象需要飞船繁琐的数据准备或访问权限,则可以使用原型模式。

2)就算 java 中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型对象的特点

3)优势在于效率高(直接克隆,避免了重新执行构造过程步骤)

4)克隆类似于 new ,但是不同于 new。new 创建新的对象属性采用的是默认值。克隆出的对象的属性值完全和原型对象相同,并且克隆出的新对象改变不会影响原型对象。然后,再修改克隆对象的值。

实现:

1)Cloneable 接口和 clone 方法

2)Prototype 模式中实现起来最困难的地方就算内存复制操作,所幸在 Java 中提供了 clone()方法替我们做了绝大部分的事情。

package cn.taosir.design.create.prototype;

import java.util.Date;

public class Sheep implements Cloneable {
    private String name;
    private Date birthday;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        //直接调用object的clone方法
        Object obj=super.clone();
        return obj;
    }
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public Date getBirthday() {return birthday;}
    public void setBirthday(Date birthday) {this.birthday = birthday;}
    public Sheep(String name, Date birthday) {
        super();
        this.name = name;
        this.birthday = birthday;
    }
    
    public static void main(String[] args) throws CloneNotSupportedException {
        Sheep s1=new Sheep("taosir", new Date());
        Sheep s2=(Sheep)s1.clone();
        System.out.println(s1==s2);
    }
}

注意:上面的代码为浅克隆,其中的引用类型字段(birthday)引用的是同一个对象

package cn.taosir.design.create.prototype;

import java.util.Date;

public class Sheep2 implements Cloneable {
    private String name;
    private Date birthday;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        //直接调用object的clone方法
        Object obj=super.clone();
        //添加如下代码实现深复制
        Sheep2 s=(Sheep2)obj;
        s.birthday=(Date)this.birthday.clone();
        return obj;
    }
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public Date getBirthday() {return birthday;}
    public void setBirthday(Date birthday) {this.birthday = birthday;}
    public Sheep2(String name, Date birthday) {
        super();
        this.name = name;
        this.birthday = birthday;
    }
    
    public static void main(String[] args) throws CloneNotSupportedException {
        Sheep2 s1=new Sheep2("taosir", new Date());
        Sheep2 s2=(Sheep2)s1.clone();
        System.out.println(s1==s2);
    }
}

深克隆的方式有很多,自行实现即可,如上 

GOF23设计模式之原型模式

原文:https://www.cnblogs.com/it-taosir/p/10502033.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!