首页 > 其他分享 >原型模式

原型模式

时间:2024-09-17 15:03:33浏览次数:1  
标签:克隆 user1 对象 创建 模式 原型 User

原型模式

原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有的对象来创建新的对象,而不是通过构造函数进行实例化。这个模式的核心思想是“克隆”现有对象,以获得新的实例,尤其是在创建成本较高的情况下非常有用。

原型模式通常涉及以下几个角色:

  1. 原型(Prototype):定义一个接口,用于创建自身的克隆对象。
  2. 具体原型(ConcretePrototype):实现原型接口,并实现一个或多个具体的克隆方法。
  3. 客户端(Client):使用原型对象来创建新的实例。

工作原理

  1. 创建原型接口:定义一个可以克隆自身的接口。
  2. 实现具体原型:实现原型接口的具体类,重写克隆方法以创建自己的副本。
  3. 使用原型:客户端通过调用原型的克隆方法来创建新的对象实例。

示例

// 原型接口
public interface Prototype extends Cloneable {
    Prototype clone();
}

// 具体原型类
public class User implements Prototype {
    private String name;
    private int age;
    private String sex;
    //用户持有联系类
    private Contact contact;
    
    // 实现克隆方法
    @Override
    public User clone() {
        try {
            //直接克隆是虚引用,属性是对象是复制地址
            //return (User) super.clone();

            //实引用,使用new实现;也可以按照序列化实现
            
            //将对象克隆一份
            User user = (User) super.clone();
            //重新创建一个对象,复值给克隆对象
            user.setContact(new Contact(this.contact.getAddress(),this.contact.getPhone()));
            return user;
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException("Cloning not supported", e);
        }
    }
}

//联系类
public class Contact{
    private String address;
    private String phone;
}

//test
 public static void main(String[] args) {
        Contact contact = new Contact("广东", "15899886699");
     
        // 创建一个用户实例
        User user1 = new User("Alice", 30, "Female",contact);
        System.out.println("Original: " + user1);

        // 克隆用户
        User clonedUser1 = user1.clone();
        System.out.println("Cloned:   " + clonedUser1);

        System.out.println("-------------------------------");

        // 修改原型的字段以验证克隆的独立性
        user1.setName("Bob");
        user1.setAge(25);
        user1.setSex("Male");
     
     	//修改联系方式
     	contact.setAddress("海南");
        contact.setPhone("18999886699");

        System.out.println("Modified Original:\n          " + user1);
        System.out.println("Cloned after modification:\n          " + clonedUser1);
    }

优点

  1. 性能优化:创建新对象的成本较低,因为通过复制现有对象来创建新对象。
  2. 避免复杂的构造过程:避免了新对象的复杂初始化过程,尤其是在对象的创建涉及复杂参数或配置时。

缺点

  1. 克隆复杂性:对于某些复杂对象,克隆过程可能涉及深拷贝,可能会比较复杂。
  2. 对象关系管理:克隆可能需要处理对象内部的引用关系和依赖关系,以确保新对象的一致性。

原型模式非常适合用于需要大量重复创建相似对象的场景,特别是在创建新对象的代价较高时。

标签:克隆,user1,对象,创建,模式,原型,User
From: https://www.cnblogs.com/20lxj666/p/18384783

相关文章

  • 建造者模式
    建造者模式建造者模式(BuilderPattern)是一种创建型设计模式,它用于分步骤地创建复杂对象,而无需直接调用构造函数。通过将对象的构建过程与其表示(即对象内部细节的实现)分离,建造者模式允许创建不同的对象表示,同时保持构造过程的一致性。特点分步骤创建:建造者模式将对象的创建过程......
  • 抽象工厂模式
    抽象工厂模式抽象工厂模式(AbstractFactoryPattern)是一种创建型设计模式,它提供一个接口,用于创建一系列相关或互相依赖的对象,而无需指定它们的具体类。抽象工厂模式常用于需要创建一组相关或依赖对象的场景,确保这些对象在不同的环境中可以协同工作。特点抽象工厂:定义了一组创......
  • 享元模式
    享元模式(FlyweightPattern)是一种结构型设计模式,旨在通过共享大量细粒度对象来减少内存使用。它在需要创建大量相似对象的场景中尤其有用,通过共享对象来降低内存开销,从而提高性能。核心思想享元模式将对象的状态分为两部分:内部状态(IntrinsicState):不随外部环境改变,可以共享的......
  • 外观模式
    外观模式外观模式(FacadePattern)是一种结构型设计模式,旨在为复杂的子系统提供一个简单的接口。它的核心思想是将系统的复杂性封装在一个统一的接口中,使得外部代码可以通过这个接口简化对复杂系统的操作。主要组成部分外观类(FacadeClass):提供一个简化的接口来访问复杂的子系统......
  • 装饰者模式
    装饰者模式装饰者模式(DecoratorPattern)是一种结构型设计模式,主要用于动态地给对象添加额外的功能,而不改变其结构。这个模式通过创建一个装饰类来包装原始对象,从而扩展其功能。主要角色组件(Component):定义一个接口或抽象类,声明可以被装饰的对象所共有的接口。具体组件(Concrete......
  • 组合模式
    组合模式组合模式(CompositePattern)是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次关系。它允许客户端以统一的方式处理单个对象和对象集合,使得客户端不需要区分具体的对象类型,从而简化了代码的处理逻辑。主要组成部分Component(组件):定义了叶子对象和......
  • 桥接模式
    桥接模式桥接模式(BridgePattern)是一种结构型设计模式,它通过将抽象部分与实现部分分离,从而使它们可以独立地变化。这个模式的主要目的是解耦抽象和实现,使得它们可以独立地变化和扩展。主要概念抽象(Abstraction):这是一个接口或抽象类,它定义了高层次的操作。修正抽象(RefinedA......
  • 【加密算法基础——AES CBC模式代码解密实践】
    AES解密实践之代码实现AES解密使用python脚本比较灵活,但是一定要保证脚本是调试过的,才能在找到正确的密文,密钥,初始向量的情况下,解出正确的明文。但是对于AES解密,命令行无法处理key截断的问题。实际测试了一下,CBC模式,对于key截断的问题可以解决,但是CFB模式,目前还无法实验......
  • 设计模式---- 门面模式
    门面模式门面模式(FacadePattern)是一种结构型设计模式,用于为复杂子系统提供一个统一、简单的接口,隐藏系统的复杂性。通过门面模式,客户端无需直接与系统的内部组件交互,而是通过门面类与系统打交道,简化了客户端的使用,降低了系统的复杂性和耦合度。门面模式的主要概念定义:门面模......
  • 攻防世界 ————新手模式适合作为桌面 misc
    (本篇文章参考大佬的解题)下载附件,得到rar的的压缩包,解压缩,打开文件后有一张图片:打开图片发现什么也没有:使用软件Stegsolve打开图片看有什么问题:点击下一页:点击后发现有一个二维码:把他保存下来,使用软件扫码看看里面有什么:(我是用微信扫码的)出现了十六进制的数字:把他复......