四、创建型(原型模式)

原型模式

概念

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


应用场景

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

注意点

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

核心要素

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

Java代码示例

java 复制代码
// 原型接口
interface Prototype {
    Prototype clone();
}

// 具体原型
class ConcretePrototype implements Prototype {
    private String name;

    public ConcretePrototype(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public 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 接口来支持深拷贝。

    java 复制代码
    class DeepClonePrototype implements Prototype, Cloneable {
        private List<String> items;
    
        public DeepClonePrototype(List<String> items) {
            this.items = new ArrayList<>(items);
        }
    
        @Override
        public Prototype clone() {
            try {
                DeepClonePrototype clone = (DeepClonePrototype) super.clone();
                clone.items = new ArrayList<>(this.items); // 深拷贝
                return clone;
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
                return null;
            }
        }
    }
  2. 利用序列化实现深拷贝

    通过序列化和反序列化实现深拷贝。

    java 复制代码
    public class SerializablePrototype implements Prototype, Serializable {
        private String name;
    
        public SerializablePrototype(String name) {
            this.name = name;
        }
    
        @Override
        public 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. 使用工厂与原型结合

    原型模式可以与工厂模式结合使用,以动态创建对象。

    java 复制代码
    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;
        }
    }

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

相关推荐
我登哥MVP11 天前
走进 Gang of Four 设计模式:访问者模式
java·设计模式·访问者模式·原型模式
学究天人12 天前
数学公理体系大全:第五章 序数与基数理论:超限算术与集合的大小
人工智能·线性代数·算法·机器学习·数学建模·原型模式
学究天人12 天前
数学公理体系大全:第六章 选择公理的等价形式及证明
人工智能·线性代数·算法·机器学习·数学建模·概率论·原型模式
学究天人13 天前
数学公理体系大全:Comprehensive Collection of Mathematical Axiom Systems(补充卷9)
人工智能·线性代数·算法·数学建模·动态规划·原型模式·抽象代数
geovindu14 天前
CSharp: Prototype Pattern
开发语言·后端·设计模式·.net·原型模式·创建型模式
Seven凹凸Man14 天前
WorkBuddy之产品经理原型设计及PRD实战
ai·原型模式
ttod_qzstudio15 天前
【软考设计模式】原型模式:“克隆“对象与深拷贝、浅拷贝精讲
设计模式·原型模式
希冀12319 天前
【JavaScript】Javascript—JS进阶—Day03
开发语言·javascript·原型模式
想吃火锅10051 个月前
【前端手撕】instanceof
前端·javascript·原型模式
UXbot1 个月前
帮助企业低门槛开展AI应用开发的平台推荐
前端·低代码·ui·交互·产品经理·原型模式·web app