1. 设计模式的分类
创建型模式(五种):工厂方法模式、单例模式、抽象工厂模式、原型模式、建造者模式。
结构型模式(七种):适配器模式、代理模式、装饰器模式、桥接模式、外观模式、享元模式、组合模式。
行为型模式(十一种):状态模式、模板方法模式、访问者模式、迭代子模式、责任链模式、备忘录模式、解释器模式、命令模式、中介者模式、观察者模式、策略模式。
2. 什么是原型模式?
原型模式是一种创建型设计模式,它允许一个对象在创建另一个可定制的对象,而无需知道如何创建的细节。这种模式通过复制现有的对象来创建新的实例,而不是新建一个。原型模式的主要优点是它可以避免直接创建对象的开销,特别是当对象创建过程复杂或耗时时。
(将原型模式融入生活,更好理解)想象一下,你正在制作陶器。你有一个原始的陶器模型,你可以通过复制这个模型来创建许多相似的陶器。这个过程不需要从头开始制作每一个陶器,而是通过复制一个已经存在的模型来快速创建新的陶器。这就是原型模式的核心思想:通过复制已有对象来创建新对象,而不是每次都从头开始创建。
3. 原型模式的组成
原型模式通常包含以下角色:
- 原型(Prototype):这是一个抽象类或接口,声明了克隆自身的接口。
- 具体原型(Concrete Prototype):实现克隆接口以创建自己的副本。
- 客户端(Client):使用克隆方法创建对象的实例。
4. 原型模式的实现
4.1 定义一个原型接口
首先,定义一个原型接口,它声明了一个 clone()
方法。
public interface Prototype extends Cloneable{
Prototype clone();
}
4.2 创建具体原型类
然后,创建一个具体的原型类,实现 Prototype
接口,并重写 clone()
方法。
public class ConcretePrototype implements Prototype{
private String id;
private String value;
public ConcretePrototype(String id, String value) {
this.id = id;
this.value = value;
}
@Override
public Prototype clone() {
try {
return (ConcretePrototype)super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public String toString() {
return "ConcretePrototype{" +
"id='" + id + '\'' +
", value='" + value + '\'' +
'}';
}
}
4.3 客户端代码
最后,编写客户端代码,使用原型模式创建对象的副本。
public class Main {
public static void main(String[] args) {
//创建一个原型实例
ConcretePrototype prototype = new ConcretePrototype("1","阿伟");
//克隆原型,创建一个新对象
Prototype clonePrototype = prototype.clone();
System.out.println("Original:" + prototype);
System.out.println("Clone:" + clonePrototype);
}
}
以下为运行结果:
5. 原型模式的适用场景
原型模式适用于以下场景:
- 创建对象成本较大时:如果创建对象的实例非常消耗资源,使用原型模式可以避免不必要的开销。
- 创建对象需要很多时间:当对象的创建过程非常耗时时,原型模式可以提供一种快速的创建方式。
- 对象创建需要特定环境或条件:在某些情况下,对象的创建依赖于特定环境或条件,原型模式可以简化这一过程。
6. 总结
原型模式是一种强大的设计模式,它可以显著提高对象创建的效率,特别是在对象创建成本较高或需要特定条件时。通过实现 Cloneable
接口和重写 clone()
方法,我们可以轻松地在Java中实现原型模式。希望本文能帮助你更好地理解和应用原型模式。