软件设计模式——原型模式

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。


优点:

  1. 性能提高。 当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过一个已有实例可以提高新实例的创建效率。
  2. 逃避构造函数的约束。
  3. 可以动态增加或减少产品类。
  4. 原型模式提供了简化的创建结构。
  5. 可以使用深克隆的方式保存对象的状态。

缺点:

  1. 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。对已有的类进行改造时,不一定是件容易的事,必须修改其源代码,违背了“开闭原则”。
  2. 必须实现 Cloneable 接口。
  3. 在实现深克隆时需要编写较为复杂的代码。

一、浅克隆

关系图:

软件设计模式——原型模式_第1张图片

 代码:

Video

package oopdemo01.Design_pattern.prototype.demo01;

import java.util.Date;

/*
1、实现一个接口Cloneable
2、重写一个方法clone()
 */
// Video
public class Video implements Cloneable {// 无良up主,克隆别人的视频
    private String name;
    private Date createTime;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public Video() {
    }

    public Video(String name, Date createTime) {
        this.name = name;
        this.createTime = createTime;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    @Override
    public String toString() {
        return "Video{" +
                "name='" + name + '\'' +
                ", createTime=" + createTime +
                '}';
    }
}

Bilibili

package oopdemo01.Design_pattern.prototype.demo01;

import java.util.Date;

/*
客户端
 */
public class Bilibili {
    public static void main(String[] args) throws CloneNotSupportedException {
        // 原型对象 v1
        Date date = new Date();
        Video v1 = new Video("王帅奇", date);

        System.out.println("v1=>" + v1);
        System.out.println("v1_hash=>" + v1.hashCode());

        // v1 克隆 v2
//        Video v2 = new Video("王帅奇", date);  // 普通复制
        Video v2 = (Video) v1.clone();  // 克隆出来的对象和原来是一模一样的
        System.out.println("v2=>" + v2);
        System.out.println("v2_hash=>" + v2.hashCode());

        System.out.println("------------");
        v2.setName("Clone:王帅奇");
        System.out.println("v2=>" + v2);
    }
}

控制台输出:

软件设计模式——原型模式_第2张图片

 Bilibili2(为什么是浅克隆)

package oopdemo01.Design_pattern.prototype.demo01;

import java.util.Date;

/*
客户端
 */
public class Bilibili2 {
    public static void main(String[] args) throws CloneNotSupportedException {
        // 原型对象 v1
        Date date = new Date();
        Video v1 = new Video("王帅奇", date);
        Video v2 = (Video) v1.clone();

        System.out.println("v1=>" + v1);
        System.out.println("v2=>" + v2);

        System.out.println("============================");
        date.setTime(22131231); // 浅克隆:v1和v2指向相同的date
        System.out.println("v1=>" + v1);
        System.out.println("v2=>" + v2);
    }
}

控制台输出:

软件设计模式——原型模式_第3张图片


二、深克隆

关系图:

软件设计模式——原型模式_第4张图片

  代码:

Video(修改代码在重写的clone()方法中)

package oopdemo01.Design_pattern.prototype.demo02;

import java.util.Date;

/*
1、实现一个接口Cloneable
2、重写一个方法clone()
 */
// Video
public class Video implements Cloneable {// 无良up主,克隆别人的视频
    private String name;
    private Date createTime;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object obj = super.clone();

        // 实现深克隆
        Video v = (Video) obj;
        // 将这个对象的属性也进行克隆
        v.createTime = (Date) this.createTime.clone();

        return obj;
    }

    public Video() {
    }

    public Video(String name, Date createTime) {
        this.name = name;
        this.createTime = createTime;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    @Override
    public String toString() {
        return "Video{" +
                "name='" + name + '\'' +
                ", createTime=" + createTime +
                '}';
    }
}

Bilibili

package oopdemo01.Design_pattern.prototype.demo02;

import java.util.Date;

/*
客户端
 */
public class Bilibili {
    public static void main(String[] args) throws CloneNotSupportedException {
        // 原型对象 v1
        Date date = new Date();
        Video v1 = new Video("王帅奇", date);
        Video v2 = (Video) v1.clone();

        System.out.println("v1=>" + v1);
        System.out.println("v2=>" + v2);

        System.out.println("============================");
        date.setTime(22131231); // 深克隆:v1和v2指向不同的date
        System.out.println("v1=>" + v1);
        System.out.println("v2=>" + v2);
    }
}

控制台输出:

软件设计模式——原型模式_第5张图片

你可能感兴趣的:(Java,原型模式,设计模式,java)