设计模式20 - 原型模式【Prototype Pattern】

简介: 设计模式20 - 原型模式【Prototype Pattern】

原型模式

定义:

原型实例 指定创建对象的种类,并且通过 拷贝这些原型 创建新的对象。

举例(发邮件案例):

public class Mail implements Cloneable{ 
    //收件人
    private String receiver; 
    //邮件名称
    private String subject; 
    //称谓
    private String appellation; 
    //邮件内容
    private String contxt; 
     //邮件的尾部,一般都是加上“XXX版权所有”等信息
    private String tail; 
    //构造函数
    public Mail(AdvTemplate advTemplate){ 
         this.contxt = advTemplate.getAdvContext(); 
         this.subject = advTemplate.getAdvSubject(); 
    } 
    @Override
    public Mail clone(){ 
         Mail mail =null; 
         try { 
             mail = (Mail)super.clone(); 
         } catch (CloneNotSupportedException e) { 
             // TODO Auto-generated catch block
             e.printStackTrace(); 
         } 
         return mail; 
     } 
    //以下为getter/setter方法
    public String getReceiver() { 
         return receiver; 
    } 
    public void setReceiver(String receiver) { 
         this.receiver = receiver; 
    } 
    public String getSubject() { 
         return subject; 
     } 
    public void setSubject(String subject) { 
         this.subject = subject; 
    } 
    public String getAppellation() { 
         return appellation; 
     } 
    public void setAppellation(String appellation) { 
         this.appellation = appellation; 
     } 
    public String getContxt() { 
         return contxt; 
     } 
    public void setContxt(String contxt) { 
         this.contxt = contxt; 
     } 
    public String getTail() { 
         return tail; 
     } 
    public void setTail(String tail) { 
         this.tail = tail; 
     } 
 } 
public class Client { 
    //发送账单的数量,这个值是从数据库中获得
    private static int MAX_COUNT = 6; 
    public static void main(String[] args) { 
     //模拟发送邮件
     int i=0; 
     //把模板定义出来,这个是从数据中获得
     Mail mail = new Mail(new AdvTemplate()); 
     mail.setTail("XX银行版权所有"); 
     while(i<MAX_COUNT){ 
         //以下是每封邮件不同的地方
 【克隆对象】------------->Mail cloneMail = mail.clone(); 
         cloneMail.setAppellation(getRandString(5)+" 先生(女士)"); 
         cloneMail.setReceiver(getRandString(5) + "@" + getRandString(8)+".com"); 
         //然后发送邮件
         sendMail(cloneMail); 
             i++; 
         } 
     } 
} 

总结:

分析:


把对象拷贝一份,产生一个新的对象,和原有对象一样,然后再修改细节的数据,如设置称谓,设置收件人地址等等。这种不通过 new 关键字来产生一个对象,而是通过对象拷贝来实现。对象拷贝时,类的构造函数是不会被执行的。一个实现了 Cloneable 并重写了 clone 方法的类 A,有一个无参构造或有参构造B,通过 new 关键字产生了一个对象 S,再然后通过 S.clone()方式产生了一个新的对象 T,那么在对象拷贝时构造函数 B是不会被执行的。

-

克隆原理:

Object 类的 clone 方法的原理是从内存中(具体的说就是堆内存)以二进制流的方式进行拷贝,重新分配一个内存块,那构造函数没有被执行也是非常正常的了。


-

使用场景:

一是类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等;

二是通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式;

三是一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过clone的方法创建一个对象,然后由工厂方法提供给调用者。


目录
相关文章
|
3月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑】设计模式——原型模式
对比原型模式和传统方式的实现思路、代码方案、优缺点,阐述原型模式的使用场景,以及深拷贝、浅拷贝等相关概念,并扩展原型模式在Spring源码中的应用。
【Java笔记+踩坑】设计模式——原型模式
|
3月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
3月前
|
设计模式 Java
Java设计模式-原型模式(3)
Java设计模式-原型模式(3)
Java设计模式-原型模式(3)
|
3月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
5月前
|
设计模式
iLogtail设计模式问题之iLogtail中的原型模式是什么
iLogtail设计模式问题之iLogtail中的原型模式是什么
iLogtail设计模式问题之iLogtail中的原型模式是什么
|
5月前
|
设计模式 JavaScript
js设计模式【详解】—— 原型模式
js设计模式【详解】—— 原型模式
52 6
|
6月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
6月前
|
设计模式 Java
Java设计模式之原型模式详解
Java设计模式之原型模式详解
|
6月前
|
设计模式
原型模式-大话设计模式
原型模式-大话设计模式
|
6月前
|
设计模式 Java Spring
设计模式——原型模式
设计模式——原型模式