您现在的位置是:首页 >学无止境 >【地铁上的设计模式】--创建型模式:原型模式网站首页学无止境

【地铁上的设计模式】--创建型模式:原型模式

喵叔哟 2023-06-12 20:00:03
简介【地铁上的设计模式】--创建型模式:原型模式

什么是原型模式

原型模式是一种创建型设计模式,它通过复制现有对象来创建新对象。该模式基于一个原型对象,通过克隆来创建新的对象,避免了创建过程中的复杂配置。原型模式分为浅拷贝和深拷贝两种类型,浅拷贝只复制对象的基本类型数据和引用类型的引用,而深拷贝则复制了整个对象,包括对象内部的引用类型。原型模式适用于需要创建大量相似对象的场景,可以提高代码复用性,减少对象创建的开销。

如何实现原型模式

原型模式的实现步骤如下:

  1. 创建原型接口,定义对象克隆的方法。
  2. 创建具体的原型类,实现原型接口,完成对象克隆的实现。
  3. 在客户端代码中,通过原型对象调用克隆方法,创建新的对象。
  4. 如果需要深拷贝,需要在原型类中重写clone()方法,实现深度克隆。

使用原型模式的关键是要确保被克隆的对象具有正确的克隆方法,并且使用合适的方式进行克隆。此外,需要注意克隆对象的引用类型数据是否需要深拷贝,以避免出现数据不一致的问题。
Java实现

public abstract class Prototype implements Cloneable {
    public Prototype clone() throws CloneNotSupportedException {
        return (Prototype) super.clone();
    }
}

public class ConcretePrototype extends Prototype {
    private String attribute;

    public String getAttribute() {
        return attribute;
    }

    public void setAttribute(String attribute) {
        this.attribute = attribute;
    }
}

public class Client {
    public static void main(String[] args) {
        ConcretePrototype prototype1 = new ConcretePrototype();
        prototype1.setAttribute("attribute1");
        try {
            ConcretePrototype prototype2 = (ConcretePrototype) prototype1.clone();
            System.out.println(prototype2.getAttribute());
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,Prototype是抽象原型类,定义了一个克隆方法,可以复制自己的对象。ConcretePrototype是具体原型类,实现了抽象原型类的克隆方法。Client是客户端代码,创建原型对象并克隆它。
在克隆时,可以通过调用clone方法实现原型对象的复制,返回的是一个新的对象,但是它与原始对象具有相同的属性值。可以在新对象上修改属性而不会影响原始对象。
C#实现

using System;

// 定义抽象原型类
abstract class Prototype {
    public abstract Prototype Clone();
}

// 具体原型类A
class ConcretePrototypeA : Prototype {
    public override Prototype Clone() {
        return (Prototype)this.MemberwiseClone();
    }
}

// 具体原型类B
class ConcretePrototypeB : Prototype {
    public override Prototype Clone() {
        return (Prototype)this.MemberwiseClone();
    }
}

// 客户端代码
class Client {
    static void Main(string[] args) {
        // 创建原型对象
        ConcretePrototypeA prototypeA = new ConcretePrototypeA();
        ConcretePrototypeB prototypeB = new ConcretePrototypeB();

        // 克隆对象
        ConcretePrototypeA cloneA = (ConcretePrototypeA)prototypeA.Clone();
        ConcretePrototypeB cloneB = (ConcretePrototypeB)prototypeB.Clone();

        Console.WriteLine("cloneA is " + cloneA.GetType().Name);
        Console.WriteLine("cloneB is " + cloneB.GetType().Name);
    }
}

在以上示例中,定义了抽象原型类Prototype,并在具体原型类ConcretePrototypeAConcretePrototypeB中实现了Clone方法来克隆对象。在客户端代码中,创建原型对象并通过调用Clone方法克隆对象。

总结

原型模式是一种创建型模式,它通过复制现有的实例来创建新的对象,避免了重复创建相同的对象,提高了系统性能和可维护性。优点包括:简化对象创建过程,提高对象创建的效率;可以动态添加或删除产品;降低了耦合度。缺点是:需要为每个类都定义一个克隆方法,实现深拷贝时需要注意对象中所有引用类型的克隆问题。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。