简谈设计模式之原型模式

原型模式是一种创建型设计模式, 用于创建对象, 而不必指定它们所属的具体类. 它通过复制现有对象 (即原型) 来创建新对象. 原型模式适用于当创建新对象的过程代价较高或复杂时, 通过克隆现有对象来提高性能

原型模式结构
  • 原型接口. 声明一个克隆自身的接口
  • 具体原型. 实现克隆的具体方法
  • 客户端. 通过调用具体原型中的克隆方法来创建新对象
原型模式实现
java 复制代码
// 原型接口
interface Prototype {
    Prototype clone();
}

// 具体原型类
class ConcretePrototype implements Prototype {
    private String field;
    
    public ConcretePrototype(String field) {
        this.field = field;
    }
    
    // 实现克隆方法
    @Override
    public Prototype clone() {
        return new ConcretePrototype(this.field);
    }
    
    @Override
    public String toString() {
        return "ConcretePrototype{" + "field = " + field + '\'' + '}';
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        // 创建原型对象
        ConcretePrototype prototype = new ConcretePrototype("prototype");
        
        // 克隆原型对象
        ConcretePrototype clone = (ConcretePrototype) prototype.clone();
        
        System.out.println(prototype);
        System.out.println(clone);
    }
}

在原型模式中, 克隆可以分为浅拷贝和深拷贝

  • 浅拷贝: 复制对象时, 只复制对象本身的基本数据类型字段和对象的引用, 而不复制引用对象本身
  • 深拷贝: 复制对象时, 不仅复制对象本身的基本数据类型字段和对象的引用, 还复制所有引用对象, 递归地进行复制

下面是深拷贝和浅拷贝的实例

浅拷贝:

java 复制代码
import java.util.ArrayList;
import java.util.List;

// 具体原型类
class ConcretePrototype implements Prototype {
    private List<String> list;

    public ConcretePrototype() {
        this.list = new ArrayList<>();
    }

    public void addItem(String item) {
        this.list.add(item);
    }

    @Override
    public Prototype clone() {
        try {
            return (ConcretePrototype) super.clone(); // 浅拷贝
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public String toString() {
        return "ConcretePrototype{" + "list=" + list + '}';
    }
}

深拷贝:

java 复制代码
import java.util.ArrayList;
import java.util.List;

// 具体原型类
class ConcretePrototype implements Prototype {
    private List<String> list;

    public ConcretePrototype() {
        this.list = new ArrayList<>();
    }

    public void addItem(String item) {
        this.list.add(item);
    }

    @Override
    public Prototype clone() {
        ConcretePrototype clone = new ConcretePrototype();
        clone.list = new ArrayList<>(this.list); // 深拷贝
        return clone;
    }

    @Override
    public String toString() {
        return "ConcretePrototype{" + "list=" + list + '}';
    }
}
相关推荐
常利兵4 分钟前
Spring项目新姿势:Lambda封装Service调用,告别繁琐注入!
java·数据库·spring
sjmaysee41 分钟前
Java框架SpringBoot(一)
java·开发语言·spring boot
寒秋花开曾相惜44 分钟前
(学习笔记)3.8 指针运算(3.8.3 嵌套的数组& 3.8.4 定长数组)
java·开发语言·笔记·学习·算法
想唱rap1 小时前
Linux线程
java·linux·运维·服务器·开发语言·mysql
golang学习记1 小时前
IDEA 2026.1官宣:AI 建议免费了!
java·ide·intellij-idea
cccccc语言我来了1 小时前
Linux(9)操作系统
android·java·linux
东离与糖宝1 小时前
金三银四Java校招面经:从双非到大厂Offer,我只准备了这些
java·面试
禾小西2 小时前
Spring AI :Spring AI的介绍
java·人工智能·spring
愤豆2 小时前
05-Java语言核心-语法特性--模块化系统详解
java·开发语言·python
bksczm2 小时前
文件流(fstream)
java·开发语言