设计模式之原型模式讲解

原型模式本身就是一种很简单的模式,在Java当中,由于内置了Cloneable 接口,就使得原型模式在Java中的实现变得非常简单。UML图如下:

我们来举一个生成新员工的例子来帮助大家理解。

复制代码
import java.util.Date;
public class Employee implements Cloneable {
    private String id;
    private String name;
    private Date hireDate;
    private transient Address address; // 注意:transient关键字表示此字段不参与序列化,这里假设地址不需要深拷贝
    public Employee(String id, String name, Date hireDate, Address address) {
        this.id = id;
        this.name = name;
        this.hireDate = (Date) hireDate.clone(); // 防止原始hireDate被修改
        this.address = address;
    }
    public String getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    public Date getHireDate() {
        return (Date) hireDate.clone(); // 返回原始hireDate的副本
    }
    public Address getAddress() {
        return address;
    }
    // 重写Object的clone方法,实现浅拷贝
    @Override
    public Employee clone() throws CloneNotSupportedException {
        Employee clonedEmployee = (Employee) super.clone();
        // 如果有引用类型字段需要深拷贝,需要在这里进行额外处理
        // 例如,如果Address也需要深拷贝,可以添加如下代码:
        // clonedEmployee.address = address.clone();
        return clonedEmployee;
    }
}
class Address implements Cloneable {
    private String street;
    private String city;
    private String country;
    public Address(String street, String city, String country) {
        this.street = street;
        this.city = city;
        this.country = country;
    }
    // 提供Address的克隆方法实现深拷贝
    public Address clone() {
        return new Address(street, city, country);
    }
    // ... getters and setters ...
}
public class PrototypeDemo {
    public static void main(String[] args) {
        try {
            // 创建原始员工对象
            Address address = new Address("123 Main St", "Anytown", "USA");
            Employee original = new Employee("001", "John Doe", new Date(), address);
            // 使用clone方法创建新员工对象
            Employee cloned = original.clone();
            // 修改克隆对象的属性,验证克隆是否成功
            cloned.setName("Jane Doe");
            cloned.getAddress().setCity("Another City");
            System.out.println("Original Employee:");
            System.out.println("ID: " + original.getId());
            System.out.println("Name: " + original.getName());
            System.out.println("Hire Date: " + original.getHireDate());
            System.out.println("Address: " + original.getAddress());
            System.out.println("\nCloned Employee:");
            System.out.println("ID: " + cloned.getId());
            System.out.println("Name: " + cloned.getName());
            System.out.println("Hire Date: " + cloned.getHireDate());
            System.out.println("Address: " + cloned.getAddress());
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}
相关推荐
高晶6 小时前
CANopen 在 BMS 系统中的 C 语言实战指南
设计模式·程序员
博风7 小时前
13、设计模式应用举例:工厂方法模式:创建药品对象
设计模式·工厂方法模式
代钦塔拉9 小时前
【C++/Qt 进阶】设计模式系列(5):适配器模式——给“不兼容的接口“贴一层翻译膜
c++·qt·设计模式
bigbread1 天前
策略模式 + 工厂方法模式在项目中的实战应用
设计模式
高晶1 天前
C 语言实现 BMS 系统中 SPI 通信协议实战指南
设计模式·程序员
代钦塔拉1 天前
【C++/Qt 进阶】设计模式系列(2):工厂模式——从游戏角色到披萨店
c++·算法·设计模式
高晶1 天前
2A3 单端甲类功放从零制作全攻略:电路设计、焊接调试到煲机维护一站式指南
前端·设计模式
代钦塔拉1 天前
【C++/Qt 进阶】设计模式系列(4):原型模式——用“克隆“代替“重新构造“
c++·qt·设计模式
博风1 天前
11、设计模式应用举例:迭代器模式:使用多个集合存储对象
设计模式·迭代器模式
日和雫2 天前
面向对象与面向过程,谁才是“银弹”?
设计模式