做网站市场价格,海外网站有哪些,东莞品牌设计公司,网站如何在百度上搜索到原型模式#xff08;Prototype Pattern#xff09;是一种创建型设计模式#xff0c;它通过拷贝现有的实例来创建新的实例#xff0c;而不是通过新建实例。这种方式可以避免复杂的构造过程#xff0c;同时还能保持对象的创建和使用分离#xff0c;提高系统的灵活性和扩展性…原型模式Prototype Pattern是一种创建型设计模式它通过拷贝现有的实例来创建新的实例而不是通过新建实例。这种方式可以避免复杂的构造过程同时还能保持对象的创建和使用分离提高系统的灵活性和扩展性。
了解原型模式之前需要先搞懂浅拷贝和深拷贝。
浅拷贝指的是创建一个新对象然后将原对象的非静态字段复制到新对象中。如果字段是基本数据类型那么直接复制其值如果字段是对象引用则复制引用本身而不是引用的对象。这意味着新对象和原对象的引用字段指向同一个对象。
深拷贝意味着不仅要复制对象本身还要复制对象中所有引用的对象以及这些引用对象中引用的其他对象直到所有相关对象都被复制。
另外java中有一些特殊的引用类型不可变对象如下。这些引用类型创建的对象是不可变对象在拷贝是都是理解成是一种深拷贝。
在Java中不可变对象是指一旦创建后其状态即对象的字段值就不能被改变的对象。不可变对象具有线程安全性、可缓存性和可共享性等优点。以下是一些常见的不可变引用类型对象基本数据类型的包装类
Integer
Byte
Short
Long
Float
Double
Character
Boolean
这些包装类都是基本数据类型的对应引用类型。它们是不可变的因为它们的值一旦被设置就不能被改变。例如当你对一个Integer对象进行加法运算时实际上会创建一个新的Integer对象来表示新的值而不是修改原来的对象。字符串类
String
String类是Java中最常用的不可变类之一。字符串对象一旦被创建其内容就不能被改变。例如当你使用操作符连接两个字符串时会创建一个新的字符串对象而不是修改原来的字符串对象。原子类
AtomicInteger
AtomicLong
AtomicBoolean
其他java.util.concurrent.atomic包中的原子类
这些原子类提供了对基本数据类型的安全操作它们是不可变的因为它们的值只能通过原子操作来更新而不是直接修改对象的状态。其他不可变类
BigDecimal 和 BigInteger
这些类用于表示任意精度的数值。它们是不可变的因为每次进行数学运算时都会返回一个新的对象来表示结果而不是修改原来的对象。java.time包中的日期和时间类
例如LocalDate
LocalTime
LocalDateTime
ZonedDateTime
Duration
Period
这些类是Java 8引入的新的日期和时间API的一部分。它们都是不可变的每次进行日期或时间的修改操作时都会返回一个新的对象。不可变对象的设计原则
要设计一个不可变对象通常需要遵循以下原则所有字段都是final的确保字段一旦被初始化就不能被改变.
不提供修改字段值的方法不提供任何可以修改对象状态的方法.
确保对象的所有字段都是不可变的如果对象的字段是引用类型确保这些引用类型也是不可变的.
如果需要提供访问字段的方法返回字段的副本而不是引用例如对于包含可变对象的字段返回字段的副本以防止外部代码修改对象的状态.
通过设计不可变对象可以提高程序的安全性和可维护性特别是在多线程环境中.
原型模式核心概念
原型Prototype声明一个克隆自身的接口用于创建当前对象的副本。在Java中通常通过实现Cloneable接口并重写clone()方法来实现原型模式。具体原型ConcretePrototype实现原型接口提供具体的克隆实现生成自己的副本。
实现步骤
实现Cloneable接口让类实现Cloneable接口表示该类的对象可以被克隆。重写clone()方法在类中重写Object类的clone()方法以实现深拷贝或浅拷贝。创建原型对象创建一个原型对象作为后续克隆的模板。克隆原型对象通过调用原型对象的clone()方法创建新的对象实例.
示例代码
以下是一个简单的Java示例展示如何使用原型模式
import java.util.Date;// 具体原型类
class Resume implements Cloneable {private String name;private String sex;private String age;private Date birthDate; // 假设包含日期对象public Resume(String name, String sex, String age) {this.name name;this.sex sex;this.age age;this.birthDate new Date(); // 初始化日期对象}Overrideprotected Object clone() throws CloneNotSupportedException {// 实现深拷贝//super.clone()是调用Object类的clone()方法它会创建一个新的对象并将原对象的字段值复制到新对象中。对于基本数据类型的字段值会被直接复制而对于引用类型的字段复制的是引用本身而不是引用所指向的对象. 这一步本身是浅拷贝.Resume clonedResume (Resume) super.clone();clonedResume.birthDate (Date) this.birthDate.clone();return clonedResume;}Overridepublic String toString() {return Resume{ name name \ , sex sex \ , age age \ , birthDate birthDate };}
}public class PrototypePatternDemo {public static void main(String[] args) throws CloneNotSupportedException {Resume originalResume new Resume(John Doe, Male, 30);System.out.println(Original Resume: originalResume);Resume clonedResume (Resume) originalResume.clone();System.out.println(Cloned Resume: clonedResume);}
}
优缺点
优点 性能优势通过拷贝现有对象避免了复杂的构造过程特别是在对象创建过程中需要进行大量数据计算或资源获取时.代码简洁简化了对象的创建代码使得代码更加简洁和易于维护.缺点 实现复杂需要实现深拷贝对于包含复杂对象引用的类实现起来可能比较复杂.对类的约束需要实现Cloneable接口并且所有涉及的对象都需要支持拷贝操作这可能对类的设计有一定的约束.
适用场景
当一个系统应该独立于其产品的创建、组合和表示时.当需要通过动态指定创建对象的类别、数目和初始化参数时.当对象的创建过程复杂且需要避免重复创建大量相似对象时.