原型模式(Protoype)
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.
之所以需要重写Cloneable的clone方法,因为方法访问修饰符是protected,外界没办法调用,这里用到
浅克隆
//原型
public class Prototype implements Cloneable{
private String name;
private String sex;
private String age;
private String timeArea;
private String company;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getTimeArea() {
return timeArea;
}
public void setTimeArea(String timeArea) {
this.timeArea = timeArea;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public Prototype(String name){
this.name = name;
}
//设置个人信息
public void SetPersonalInfo(String sex,String age){
this.sex = sex;
this.age = age;
};
//设置工作经历
public void SetWorkExperience(String timeArea,String company){
this.timeArea = timeArea;
this.company = company;
};
//显示
public void Display(){
System.out.println(name+"--年龄:"+age+"--性别:"+sex);
System.out.println("工作经历:"+timeArea+"--"+company);
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
};
}
入口main
public class Test {
public static void main(String[] args) throws Exception {
Prototype pro = new Prototype("小甜甜");
pro.SetPersonalInfo("女", "21");
pro.SetWorkExperience("2000-01-01", "天朝软件");
Prototype pro1 = (Prototype)pro.clone();
//一下输出,这不是同一个对象
//System.out.println(pro!=pro1);
pro1.SetPersonalInfo("男", "22");
pro1.SetWorkExperience("2000-01-01", "地府软件");
pro1.Display();
pro.Display();
}
}
以下引用Heart.X.Raid的Java深浅克隆
Java支持克隆
既然如此,难道我们就没有办法在某一个类的作用域外部来克隆这个类了吗?
答案是否定的! 我们可以在任何一个类中重写clone方法,并升级它的访问作用域。事实上,使用的时候也就是这样做的!
首先我们必须在需要克隆的类上实现一个重要的接口——Cloneable接口。这种接口我们叫作
标记接口(tagging interface) 。这种标记接口没有任何方法,唯一的作用就是作为一个标志,用来告诉JVM一个类是否具有某个特定的功能。
如此一来,我们只要定义一个具有 Clone 功能的类就可以了:
1. 在类的声明中加入“ implements Cloneable ”,标志该类有克隆功能;
2. 重载类 Object 的 clone() 方法,在该方法中调用 super.clone() :
class Employee implements Cloneable{
public Object clone() throws CloneNotSupportedException{//重载clone()方法
Employee cloned=(Employee)super.clone();
return cloned;
}
}
class Employee implements Cloneable{
public Object clone() throws CloneNotSupportedException{//重载clone()方法
Employee cloned=(Employee)super.clone();
return cloned;
}
}
深Clone和浅Clone
拷贝副本的问题并没有完全解决。clone技术并不是那么简单的。Object中的clone()方法是对具体类对象的各个域进行对应的赋值。如果具体类对象中还有子对象,这个问题就复杂了。
// 具备浅克隆的Employee类
class Employee implements Cloneable{
public String name="";
public Date hireDay=null;
public Object clone(){
Employee cloned=(Employee)super.clone();
return cloned;
}
}
Employee orignal=new Employee();
Employee copy=orignal.copy();
对于上面的代码,克隆以后orignal与copy中的hireDay指向的是同样的存储位置。也就是说当我们调用copy.hireDay.setTime()方法后,orignal中的hireDay也会发生改变。但String类(由于常量池的存储方式)和基本数据类型变量时不会改变的。这种对子对象克隆无效的方式我们叫做
浅克隆 。
很多情况下,我们需要将对象中的所有域(包括子对象)都进行真正的克隆。要做到这种深克隆,我们必须在重载clone()方法时克隆子对象:
//具备深度克隆功能的Employee类
class Employee implement Cloneable{
public String name="";
private Date hireDay=null;
public Object clone(){
Employee cloned=(Employee)super.clone(); //浅克隆
cloned.hireDay=(Date)hireDay.clone(); //克隆子对象
return cloned;
}
}
分享到:
相关推荐
在Python中,实现原型模式相对简单,因为Python提供了内置的`copy`模块,可以方便地实现浅复制和深复制。在`Prototype.py`文件中,我们可能会看到以下代码结构: ```python class Prototype: def __init__(self, ...
Axure9项目原型案例-原型50-案例20-原件1
简单工厂模式-果园种植水果 建造者模式-建造不同的果园 原型模式-建造同样的果园 桥接模式-果园实现统一的种植方法 原型模式-建造同样的果园 原型模式-建造同样的果园 适配器模式-果园改变种植方式 原型模式-建造...
JAVA-设计模式-创建型模式-原型模式
-425款经典优秀H5小游戏合集】游戏源码分享下载 --- hczz.zipHTML5小游戏【横冲直撞(1024原型)--425款经典优秀H5小游戏合集】游戏源码分享下载 --- hczz.zipHTML5小游戏【横冲直撞(1024原型)--425款经典优秀H5小...
该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。 原型模式的实现思路是:首先,我们需要定义一个原型对象,然后通过该对象的 clone() 方法创建一个新的对象。新的对象将...
《Axure产品经理原型教程-入门到精通》是一本旨在帮助产品经理深入理解和掌握Axure软件的实用教程。Axure是一款强大的原型设计工具,广泛应用于产品设计和开发过程中,它能够快速创建交互式 wireframes 和 ...
ava常用设计模式-原型模式 原型模式(Prototype Pattern)是一种创建型设计模式,允许通过复制现有对象来创建新对象,而不是通过实例化类来创建新对象。在需要创建大量相似对象时非常有用,它可以避免重复创建对象...
java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】 * 原型模式(Prototype) * 实现方式: * 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 ...
原型模式的基本思想是通过对象的克隆(clone)方法创建新对象。在C++中,我们可以自定义`clone()`方法来返回对象的一个副本。这使得创建新对象的过程变得简单且灵活,特别是当创建新对象的复杂度较高时。 ### 浅...
原型模式是一种设计模式,主要应用于软件工程领域,用于创建重复的对象,而无需再次进行实例化。在Java、C#等面向对象的语言中,原型模式通过实现`Cloneable`接口或使用序列化机制来实现对象的复制。在这个"原型模式...
原型模式(Prototype Pattern)是其中一种行为设计模式,主要用于对象创建。它通过复制已有对象来创建新对象,而不是通过传统的构造函数来创建。在Java中,原型模式可以有效地提高性能,特别是在创建复杂对象时。 #...
**原型模式(Prototype Pattern)**是软件设计模式中的结构型模式之一,主要用来简化实例化过程,减少类的创建。在原型模式中,一个对象可以被用作创建其他新对象的模板,通过复制已有对象来创建新对象,而不是通过new...
在C++中,原型模式常常利用拷贝构造函数或赋值运算符来实现对象的克隆。这种模式在需要频繁创建和删除相似对象时特别有用,因为它可以提高性能并减少代码复杂性。 ### 1. 原型模式的核心概念 - **原型(Prototype...
原型模式(Prototype Pattern)是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而无需知道具体创建过程的细节。这种模式的核心在于,它提供了一种对象克隆的简便方法,使得对象的创建过程对用户...
5. **与其他模式的结合**:原型模式可以和工厂模式结合使用,工厂模式负责创建原型对象,而原型模式则负责克隆这些对象,提供更灵活的扩展。 6. **示例代码**:PPT可能还包含了Java或其他语言的示例代码,展示如何...
下面是一个简单的C++原型模式实现示例: ```cpp // 接口类 class Prototype { public: virtual ~Prototype() {} virtual Prototype* clone() const = 0; }; // 具体类 class ConcretePrototype : public ...
原型模式是一种设计模式,主要目的是通过复制现有对象来创建新对象,从而简化创建过程并减少对象构造的开销。在Java中,实现原型模式通常涉及`Cloneable`接口和`clone()`方法。`Cloneable`接口是一个标记接口,类...
乐仓商城手机端原型--V2.0--0307.rp
最棒的AXURE原型系列1-6季的全部作品 最棒的AXURE原型系列1-6季的全部作品 最棒的AXURE原型系列1-6季的全部作品 最棒的AXURE原型系列1-6季的全部作品 最棒的AXURE原型系列1-6季的全部作品 最棒的AXURE原型系列1-6季...