04.设计模式-原型模式

简介: 原型模式属于创建型模式,用原型的实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。调用者不需要关注具体的复制过程,而且不需要知道任何创建的细节,通俗来讲,就是使用一个对象复制一个一模一样的对象出来,目的就是保护最原始的那一份存档。

原型模式属于创建型模式,用原型的实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。调用者不需要关注具体的复制过程,而且不需要知道任何创建的细节,通俗来讲,就是使用一个对象复制一个一模一样的对象出来,目的就是保护最原始的那一份存档。

为什么要保护最原始的那一份存档?以工业生产为例,这里的最原始的那一份存档就相当于工厂中某一商品的模具,其他的所有商品都是由这个模具为雏形,所以,这个模具是不能轻易改变,如果生产了一个商品后,这个商品把模具改变了,那么其后边被生产的产品就不再满足设计要求了。这一特点也决定了原型模式的一个应用场景。

那么原型模式通常应用在哪些方面?

1.从时间成本来说和性能消耗方面来说,假设一个需求中需要创建大量相同的对象,而对象的创建又很耗费时间资源或者空间资源,又不依赖于类的构造方法的时候(clone不会执行构造方法),可以使用原型模式
2.同一个对象,如果存在大量的潜在修改者,每个修改者是基于这个对象最初的状态作修改,相互之间没有影响,可以使用原型模式,例如:我要群发一条邮件,邮件内容,主题,发送时间,等等都是相同的,唯一不同的只有收件人,那么,就可以在这个邮件模版的原型上,通过只修改收件人的值来进行发送即可

public interface Prototype {
    Prototype cloneMessage();
}
public interface IMessage extends Prototype{

    String content();
    String sender();
    String receiver();
    String image();
    String voice();
    
}

public class ImageMessage implements Cloneable,IMessage{
    
    public String sender;
    public String content;
    public String receiver;
    public String voice;
    public String image;

    @Override
    public String content() {
        return content;
    }

    @Override
    public String sender() {
        return sender;
    }

    @Override
    public String receiver() {
        return receiver;
    }
    
    public void setContent(String content){
        this.content = content;
    }
    
    public void setReceiver(String receiver){
        this.receiver = receiver;
    }
    
    public void setSender(String sender){
        this.sender = sender;
    }
    public void setImage(String image){
        this.image = image;
    }

    public String image() {
        return image;
    }

    @Override
    public Prototype cloneMessage() {
        ImageMessage message = new ImageMessage();
        message.content = this.content;
        message.image = this.image;
        message.receiver = this.receiver;
        message.sender = this.sender;
        message.voice = this.voice;
        return message;
        
    }

    @Override
    public String voice() {
        // TODO Auto-generated method stub
        return null;
    }
}


public class VoiceMessage implements IMessage{
    
    public String sender;
    public String content;
    public String receiver;
    
    public String voice;
    private String image;
    
    @Override
    public String content() {
        return content;
    }

    @Override
    public String sender() {
        return sender;
    }

    @Override
    public String receiver() {
        return receiver;
    }
    
    public void setContent(String content){
        this.content = content;
    }
    
    public void setReceiver(String receiver){
        this.receiver = receiver;
    }
    
    public void setSender(String sender){
        this.sender = sender;
    }
    
    public void setVoice(String voice){
        this.voice = voice;
    }
    
    public String voice(){
        return voice;
    }
    @Override
    public Prototype cloneMessage() {
        VoiceMessage message = new VoiceMessage();
        message.content = this.content;
        message.voice = this.voice;
        message.receiver = this.receiver;
        message.sender = this.sender;
        message.image = this.image;
        return message;
    }

    @Override
    public String image() {
        return image;
    }

}


public class Client {

    public static void main(String[] args) {
        
        VoiceMessage m = new VoiceMessage();
        m.setContent("语音消息");
        m.setSender("张三");
        m.setReceiver("李四");
        m.setVoice("语音");
        
//      ImageMessage m = new ImageMessage();
//      m.setContent("图片消息");
//      m.setSender("张三");
//      m.setReceiver("李四");
//      m.setImage("图片");
        
        MessageEngine.sendMessage(m);
    }

}

public class MessageEngine {

    public static void sendMessage(IMessage message){   
        IMessage m = (IMessage) message.cloneMessage(); 
        System.out.println("发送消息----消息内容:"+m.content()+"---消息发送人:"+m.sender()+"---消息接受人:"+m.receiver()+"---图片:"+m.image()+"---语音:"+m.voice());
    }
}
相关文章
|
设计模式 安全 Java
面向对象编程的精髓:Java设计模式 - 原型模式(Prototype)完全参考手册
【4月更文挑战第7天】原型模式是OOP中的创建型设计模式,用于通过复制现有实例创建新实例,尤其适用于创建成本高或依赖其他对象的情况。它包括Prototype接口、ConcretePrototype实现和Client客户端角色。优点是性能优化、避免子类化和动态增加产品族。实现包括定义原型接口、实现具体原型和客户端调用克隆方法。最佳实践涉及确保克隆正确性、选择深拷贝或浅拷贝及考虑线程安全。但需注意克隆方法管理、性能开销和循环引用等问题。在Java中,实现Cloneable接口和覆盖clone方法可实现原型模式。
340 4
|
设计模式 Java 关系型数据库
23种设计模式 —— 原型模式【克隆羊、浅拷贝、深拷贝】
23种设计模式 —— 原型模式【克隆羊、浅拷贝、深拷贝】
358 1
|
设计模式 安全 Java
【设计模式】原型模式
【设计模式】原型模式
253 0
|
设计模式 JavaScript Java
【设计模式】【创建型模式】原型模式(Prototype)
一、入门 什么是原型模式? 原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有对象来创建新对象,而不是通过实例化类。 原型模式的核心是克隆(Clone),即通过复制现有
356 15
|
设计模式 存储 Java
「全网最细 + 实战源码案例」设计模式——原型模式
原型模式(Prototype Pattern)是一种创建型设计模式,通过复制现有对象来创建新对象,适用于创建成本高或复杂的对象场景。其核心思想是“克隆”,避免直接实例化类。结构上分为抽象原型类、具体原型类和客户端。优点包括减少对象创建成本、隐藏复杂性、简化实例创建;缺点是处理循环引用的复杂对象时较为麻烦。实现步骤为定义原型类、重写`clone()`方法并调用。注意事项包括浅拷贝与深拷贝的区别及`Cloneable`接口的使用。
333 20
|
设计模式 Java 关系型数据库
【Java笔记+踩坑】设计模式——原型模式
对比原型模式和传统方式的实现思路、代码方案、优缺点,阐述原型模式的使用场景,以及深拷贝、浅拷贝等相关概念,并扩展原型模式在Spring源码中的应用。
【Java笔记+踩坑】设计模式——原型模式
|
设计模式 Java
Java设计模式-原型模式(3)
Java设计模式-原型模式(3)
232 0
Java设计模式-原型模式(3)
|
设计模式 JavaScript
js设计模式【详解】—— 原型模式
js设计模式【详解】—— 原型模式
291 6
|
设计模式
iLogtail设计模式问题之iLogtail中的原型模式是什么
iLogtail设计模式问题之iLogtail中的原型模式是什么
iLogtail设计模式问题之iLogtail中的原型模式是什么
|
设计模式 Java
【设计模式系列笔记】原型模式
原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而无需知道其具体类型。这种模式属于对象创建型模式,通过克隆来避免使用new关键字创建对象,提高性能和降低系统的耦合度。
331 6

热门文章

最新文章