科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道原始模型模式

原始模型模式

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

原始模型模式,我认为也可以称为克隆模式,就是由一个完整的产品对象复制出另一个对象的模式。它也是对象的创建模式,但是只与原始对象有关,不需要工厂类。

作者:Rayman 来源:CSDN 2008年3月18日

关键字: 模式 原始模型 java

  • 评论
  • 分享微博
  • 分享邮件
  原始模型模式,我认为也可以称为克隆模式,就是由一个完整的产品对象复制出另一个对象的模式。它也是对象的创建模式,但是只与原始对象有关,不需要工厂类。
        原始模型模式最成功的应用之一就是Object类的clone方法,可能由于这种方法的存在,很多人没有意识到原始模型模式是一种特定的创建模式。但是,它的确是一种产生对象的模式,而且clone方法所实现的只是原始模型模式的一种情况。
        原始模型模式的对象创建方式有两种,可以分别称为浅复制和深复制:浅复制就是从原对象复制出新的对象时,并不复制它的成员对象,即它的成员对象句柄所指向的还是原对象中的成员对象;深复制就是在新对象中,成员对象也是新的。
package prototype;

public interface Prototype {

    
public void printPart();
    
    Object flatClone();
    
    Object deepClone() 
throws Exception;
    
}



package prototype;

import java.io.*;

public class ConcretePrototype implements Prototype , Serializable{

    
private Part part;
    
    
public ConcretePrototype() {
        part 
= new Part();
    }

    
    
public void printPart() {
        System.out.println(part);
    }

    

    
public Object flatClone() {
        ConcretePrototype cp 
= new ConcretePrototype();
        cp.part 
= this.part;
        
return cp;
    }


    
    
public Object deepClone() throws Exception {
        ByteArrayOutputStream bo 
= new ByteArrayOutputStream();
        ObjectOutputStream oo 
= new ObjectOutputStream(bo);
        oo.writeObject(
this);
        ByteArrayInputStream bi 
= new ByteArrayInputStream(bo.toByteArray());
        ObjectInputStream oi 
= new ObjectInputStream(bi);
        
return (oi.readObject());
    }


    
class Part implements Serializable {
        
    }

    
}



package prototype;

public class Client {
    
    
public static void main(String[] args) throws Exception {
        ConcretePrototype originate, cloned, deepCloned;
        originate 
= new ConcretePrototype();

        Thread.sleep(
2000);

        cloned 
= (ConcretePrototype)originate.flatClone();
        deepCloned 
= (ConcretePrototype)originate.deepClone();
        System.out.println(originate);
        System.out.println(cloned);
        System.out.println(deepCloned);
        originate.printPart();
        cloned.printPart();
        deepCloned.printPart();
    }


}

 

   

        可以看出,打印的前三行各不相同,这说明通过浅复制和深复制,所得到的对象都是与原对象不同的;打印的后三行中有两行相同,这说明,在浅复制时,成员对象的实体没有被复制,只是复制了其句柄,而深复制时,成员对象的实体也被复制了。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章