Java设计模式-原型模式-一次性理解透

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • [1. 前言](#1. 前言)
  • [2. 原型模式的主要角色](#2. 原型模式的主要角色)
    • [2.1 原型接口或抽象类](#2.1 原型接口或抽象类)
    • [2.2 具体原型类](#2.2 具体原型类)
    • [2.3 客户端](#2.3 客户端)
    • [2.4 克隆方法](#2.4 克隆方法)
  • [3. 原型模式使用场景](#3. 原型模式使用场景)
    • [3.1 创建对象是昂贵的](#3.1 创建对象是昂贵的)
    • [3.2 对象的变化](#3.2 对象的变化)
    • [3.3 动态配置](#3.3 动态配置)
    • [3.4 减少初始化开销](#3.4 减少初始化开销)
  • [4. 原型模式的代码示例](#4. 原型模式的代码示例)
    • [4.1 原型接口:Shape](#4.1 原型接口:Shape)
    • [4.2 具体原型():Circle](#4.2 具体原型():Circle)
    • [4.3 客户端():ShapeClient](#4.3 客户端():ShapeClient)
    • [4.4 上述示例的完整代码](#4.4 上述示例的完整代码)
  • [5. 总结](#5. 总结)

1. 前言

原型模式(Prototype Design Pattern)是一种创建型 设计模式,‌它允许通过复制一个已经存在的对象来创建一个新的对象 ,‌而无需重新实例化 。‌这种模式特别适用于那些需要创建类似对象的情况,‌可以避免重复的代码和资源浪费。‌原型模式的核心在于提供一个原型对象,‌通过这个原型对象来生成其他对象,‌而不需要知道这些对象的类结构。‌

2. 原型模式的主要角色

2.1 原型接口或抽象类

原型接口或抽象类 声明了用于克隆对象的方法。它定义了具体原型必须实现的通用接口,确保所有原型都可以以一致的方式进行克隆。

  • 主要作用是通过指定克隆契约来提供创建新对象的蓝图。
  • 它声明了clone具体原型实现的方法来生成自身的副本。

2.2 具体原型类

实现了抽象原型类中的clone()方法,‌负责创建与原型对象相同的新对象。‌

  • 它定义了如何对该类的实例执行克隆过程的细节。
  • 实现clone原型接口中声明的方法,提供该类特有的克隆逻辑。

2.3 客户端

客户端是通过与原型交互来请求创建新对象的代码或模块。它启动克隆过程,但不知道所涉及的具体类。

2.4 克隆方法

clone 方法在原型接口或抽象类中声明。它指定应如何复制或克隆对象。具体原型实现此方法来定义其独特的克隆行为。它描述了应如何复制对象的内部状态以创建新的独立实例。

3. 原型模式使用场景

3.1 创建对象是昂贵的

当创建对象比复制现有对象更昂贵或更复杂时,使用原型模式。

如果对象创建涉及大量资源,例如数据库或网络调用,并且您有可用的类似对象,则克隆会更有效率。

3.2 对象的变化

当您的系统需要支持多种略有变化的对象时,请使用原型模式。

您可以创建原型并通过修改进行克隆,而不必为每个变体创建多个类。

3.3 动态配置

当您的系统需要动态配置并且您想要在运行时创建具有配置的对象时,请使用原型模式。

您可以创建基本配置的原型并克隆它,并根据需要调整属性。

3.4 减少初始化开销

当您想要减少初始化对象的开销时,请使用原型模式。

创建克隆比从头创建对象更快,尤其是在初始化过程耗费大量资源的情况下。

4. 原型模式的代码示例

示例场景:假设您正在开发一个绘图应用程序,需要创建和操作各种形状。每个形状可能具有不同的属性,例如颜色或大小。为每个变体创建新的形状类会变得很麻烦。此外,在运行时动态添加或删除形状也很有挑战性。

让我们了解原型设计模式如何帮助解决这个问题:

  • 原型设计模式有助于有效地管理形状的变化,提高形状创建的灵活性,并简化在运行时添加或删除形状的过程。
  • 原型设计模式通过引入原型接口(Shape)来解决此问题,该接口声明了克隆和绘制形状的常用方法。
  • 具体原型类似于Circle实现这个接口,提供它们独特的克隆逻辑。
  • 扮演ShapeClient用户的角色,利用原型创建新的形状。

4.1 原型接口:Shape

我们定义一个名为的接口Shape作为原型。它声明了两种方法:clone()复制自身和draw()绘制形状。

java 复制代码
// This is like a blueprint for creating shapes.
// It says every shape should be able to clone itself and draw.
public interface Shape {
	Shape clone(); // Make a copy of itself
	void draw(); // Draw the shape
}

4.2 具体原型():Circle

我们Shape用一个具体的类来实现接口CircleCircle该类有一个私有字段color和一个构造函数,用于在创建圆时设置颜色。它实现了clone()创建自身副本(Circle具有相同颜色的新副本 )的方法。该draw()方法用于打印一条消息,指示如何绘制圆。

java 复制代码
// This is a specific shape, a circle, implementing the Shape interface.
// It can create a copy of itself (clone) and draw in its own way.
public class Circle implements Shape {
	private String color;

	// When you create a circle, you give it a color.
	public Circle(String color) {
		this.color = color;
	}

	// This creates a copy of the circle.
	@Override
	public Shape clone() {
		return new Circle(this.color);
	}

	// This is how a circle draws itself.
	@Override
	public void draw() {
		System.out.println("Drawing a " + color + " circle.");
	}
}

4.3 客户端():ShapeClient

我们创建一个客户端类ShapeClient,它将使用原型来创建新的形状。客户端有一个字段shapePrototype表示它将使用的原型。构造函数采用Shape原型,并且有一个方法createShape()可以使用原型的clone()方法创建新的形状。

java 复制代码
// This is like a user of shapes.
// It uses a prototype (a shape) to create new shapes.
public class ShapeClient {
	private Shape shapePrototype;

	// When you create a client, you give it a prototype (a shape).
	public ShapeClient(Shape shapePrototype) {
		this.shapePrototype = shapePrototype;
	}

	// This method creates a new shape using the prototype.
	public Shape createShape() {
		return shapePrototype.clone();
	}
}

4.4 上述示例的完整代码

在主类PrototypeExample中,我们创建了一个红色圆圈的具体原型(circlePrototype)。然后,我们创建一个ShapeClient,并为其提供红圈原型。客户端使用原型通过createShape()方法创建新形状(redCircle)。最后,我们使用draw()方法绘制新创建的红色圆圈。

java 复制代码
// Prototype interface
interface Shape {
	Shape clone(); // Make a copy of itself
	void draw(); // Draw the shape
}

// Concrete prototype
class Circle implements Shape {
	private String color;

	// When you create a circle, you give it a color.
	public Circle(String color) {
		this.color = color;
	}

	// This creates a copy of the circle.
	@Override
	public Shape clone() {
		return new Circle(this.color);
	}

	// This is how a circle draws itself.
	@Override
	public void draw() {
		System.out.println("Drawing a " + color + " circle.");
	}
}

// Client code
class ShapeClient {
	private Shape shapePrototype;

	// When you create a client, you give it a prototype (a shape).
	public ShapeClient(Shape shapePrototype) {
		this.shapePrototype = shapePrototype;
	}

	// This method creates a new shape using the prototype.
	public Shape createShape() {
		return shapePrototype.clone();
	}
}

// Main class
public class PrototypeExample {
	public static void main(String[] args) {
		// Create a concrete prototype (a red circle).
		Shape circlePrototype = new Circle("red");

		// Create a client and give it the prototype.
		ShapeClient client = new ShapeClient(circlePrototype);

		// Use the prototype to create a new shape (a red circle).
		Shape redCircle = client.createShape();

		// Draw the newly created red circle.
		redCircle.draw();
	}
}

5. 总结

在本文,我们学习了Java的一种创建型 设计模式原型模式 ,知道它拥有原型接口具体原型类客户端克隆方法四个角色,还阐述了原型模式的使用场景,以及呈现了原型模式的代码示例,相信大家应该对原型模式不陌生了!!

相关推荐
学习编程的Kitty13 小时前
算法——位运算
java·前端·算法
用户9047066835714 小时前
如何使用 Spring MVC 实现 RESTful API 接口
java·后端
刘某某.14 小时前
数组和小于等于k的最长子数组长度b
java·数据结构·算法
程序员飞哥14 小时前
真正使用的超时关单策略是什么?
java·后端·面试
用户9047066835714 小时前
SpringBoot 多环境配置与启动 banner 修改
java·后端
小old弟14 小时前
后端三层架构
java·后端
花花鱼14 小时前
spring boot 2.x 与 spring boot 3.x 及对应Tomcat、Jetty、Undertow版本的选择(理论)
java·后端
温柔一只鬼.14 小时前
Docker快速入门——第二章Docker基本概念
java·docker·容器
要争气14 小时前
5 二分查找算法应用
java·数据结构·算法
郑..方..醒14 小时前
java实现ofd转pdf
java·pdf