四、创建型(原型模式)

server/2024/10/18 4:36:41/

原型模式

概念
原型模式是一种创建型设计模式,通过复制现有对象来创建新对象,而不是通过构造函数。该模式使用原型实例指定创建对象的种类,并通过复制这些原型实例来生成新对象。


应用场景

  1. 对象创建成本高:当创建对象的成本较高时,可以通过复制现有对象来节省资源。
  2. 对象配置复杂:需要频繁创建配置相似但不完全相同的对象时,通过原型模式可以简化配置。
  3. 需要支持撤销/恢复功能:在某些应用中,需要保存对象的状态,原型模式可以快速复制对象的状态。
  4. 避免子类化:在不知道要创建多少个具体产品的情况下,使用原型模式可以避免大量的子类化。

注意点

  • 深拷贝与浅拷贝:需要明确是使用深拷贝(复制对象及其引用的对象)还是浅拷贝(仅复制对象本身,引用指向同一对象)。
  • 克隆失败:如果对象中存在不可克隆的成员,可能会导致克隆失败。
  • 序列化:在某些情况下,可以通过序列化和反序列化实现对象的深拷贝。

核心要素

  1. 原型接口:定义克隆方法。
  2. 具体原型:实现原型接口并提供具体的克隆实现。
  3. 客户端:使用原型来创建新对象。

Java代码示例

// 原型接口
interface Prototype {Prototype clone();
}// 具体原型
class ConcretePrototype implements Prototype {private String name;public ConcretePrototype(String name) {this.name = name;}public String getName() {return name;}@Overridepublic Prototype clone() {return new ConcretePrototype(name);}
}// 客户端
public class Client {public static void main(String[] args) {ConcretePrototype prototype = new ConcretePrototype("原型A");ConcretePrototype clone = (ConcretePrototype) prototype.clone();System.out.println("克隆对象的名称: " + clone.getName());}
}

各种变形用法

  1. 深拷贝与浅拷贝
    通过实现 Cloneable 接口来支持深拷贝。

    class DeepClonePrototype implements Prototype, Cloneable {private List<String> items;public DeepClonePrototype(List<String> items) {this.items = new ArrayList<>(items);}@Overridepublic Prototype clone() {try {DeepClonePrototype clone = (DeepClonePrototype) super.clone();clone.items = new ArrayList<>(this.items); // 深拷贝return clone;} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}}
    }
    
  2. 利用序列化实现深拷贝
    通过序列化和反序列化实现深拷贝。

    public class SerializablePrototype implements Prototype, Serializable {private String name;public SerializablePrototype(String name) {this.name = name;}@Overridepublic Prototype clone() {try {ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream out = new ObjectOutputStream(bos);out.writeObject(this);ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream in = new ObjectInputStream(bis);return (SerializablePrototype) in.readObject();} catch (IOException | ClassNotFoundException e) {e.printStackTrace();return null;}}
    }
    
  3. 使用工厂与原型结合
    原型模式可以与工厂模式结合使用,以动态创建对象。

    class PrototypeFactory {private Map<String, Prototype> prototypes = new HashMap<>();public void registerPrototype(String key, Prototype prototype) {prototypes.put(key, prototype);}public Prototype createPrototype(String key) {Prototype prototype = prototypes.get(key);return prototype != null ? prototype.clone() : null;}
    }
    

这些是原型模式的基本知识和变形用法。


http://www.ppmy.cn/server/132000.html

相关文章

Idea 不显示target目录

https://blog.csdn.net/benwudashi/article/details/114642264 去掉target就可以了

CloseableHttpResponse 类(代表一个可关闭的 HTTP 响应)

CloseableHttpResponse 类是 Apache HttpClient 库中的一个类&#xff0c;代表一个可关闭的 HTTP 响应。当你使用 HttpClient 发送请求时&#xff0c;你会得到一个 CloseableHttpResponse 实例&#xff0c;它包含了服务器的响应数据和状态。处理完响应后&#xff0c;你应该关闭…

如何理解Flask中的ORM技术

Flask中的ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;是一种编程技术&#xff0c;用于在关系数据库和对象程序语言之间转换数据。在Flask框架中&#xff0c;最常用的ORM工具是SQLAlchemy&#xff0c;通过Flask-SQLAlchemy扩展集成到Flask应…

VSCode运行QT界面

VSCode用久了,感觉Qt Creator的写起代码来还是不如VSCode得心应手,虽然目前还是存在一些问题,先把目前实现的状况做个记录,后续有机会再进一步优化。 当前方式 通过QtCreator创建一个CMake项目,然后使用CMake的方式在VSCode中进行编译。 claude给出的建议 左上角的名字会…

若依前后端框架学习——新建模块(图文详解)

若依框架—新建模块 一、项目地址1、后端启动2、前端启动 二、生成代码1、添加菜单2、创建表结构3、生成代码2、编辑一些基本信息&#xff0c;然后点击提交3、生成代码&#xff0c;压缩包里有前端和后端代码 三、配置后端模块1、新建模块2. 修改pom.xlm2.1 修改第一个pom.xml 2…

1. 到底什么是架构

1. 什么是架构 定义&#xff1a;架构&#xff0c;又名软件架构&#xff0c;是有关软件整体结构与组件的抽象描述&#xff0c;用于指导大型软件系统各个方面的设计优秀架构的特点&#xff1a;优秀的性能、超强的TPS/QPS的承载能力、高可用决定了你能够支撑多少PV的流量 2. 什么…

【微服务】微服务发现详解:构建高效分布式系统的关键

目录 引言一、什么是微服务发现&#xff1f;1.1 微服务发现的分类 二、服务注册中心2.1 服务注册流程 三、服务发现流程四、微服务发现的实现方式4.1 Eureka 示例4.2 Consul 示例4.3 Zookeeper 示例4.4 Kubernetes 示例4.5 服务健康检查与稳定性 五、微服务发现的优缺点5.1 动态…

Dockerfile 详解

Dockerfile是自定义Docker镜像的一套规则&#xff0c;由多条指令构成&#xff0c;每条指令都会对应于Docker镜像中的每一层&#xff0c;因为Docker是分层存储的。以下是Dockerfile中各个参数的详解及演示解析&#xff1a; 1. FROM 功能&#xff1a;指定待扩展的父级镜像&#…