原型模式是一种创建型设计模式,其核心思想是利用已有的原型对象来创建新对象。[1]
定义
原型模式是一种创建型设计模式,它允许一个对象再创建另外一个可定制的对象,而无需了解具体的创建过程。这种模式的工作原理是通过将一个原型对象传递给另一个对象,后者可以通过请求原型对象拷贝自身的方式来实现对象的创建。[2]
作用
原型模式主要用于解决复杂对象的创建工作,特别是在需求变化频繁的情况下,这些对象往往具有稳定的接口。
实现
在Java中,原型模式的实现非常简单,因为它提供了clone()方法用于对象的克隆。例如,对于一个勺子对象,可以轻松地调用Prototype模式来进行克隆操作。此外,还可以结合工厂模式来创建AbstractSpoon实例。在Java中,原型模式几乎与设计模式融为一体,许多模式都体现了这一点,比如Iterator遍历模式。
结构
客户端角色(Client):负责向原型管理器提出创建对象的请求。
抽象原型角色(Prototype):由接口或抽象类实现,定义所有具体原型类所需的方法。在Java中,通常实现ICloneable接口。
具体原型角色(Concrete Prototype):实际被复制的对象,需要实现抽象原型角色定义的接口。
原型管理器角色(Prototype Manager):负责创建并维护具体原型类的对象集合。[3]
示例代码
```java
public interface Spoon extends Cloneable {
public Spoon clone();
}
public class WoodenSpoon implements Spoon {
private String name;
public WoodenSpoon(String name) {
this.name = name;
}
@Override
public WoodenSpoon clone() {
return (WoodenSpoon) super.clone();
}
}
```
```java
public class SpoonFactory {
private Map<String, Spoon> spoons = new HashMap<>();
public Spoon createSpoon(String type) {
if (!spoons.containsKey(type)) {
throw new IllegalArgumentException("Unknown spoon type: " + type);
}
return spoons.get(type).clone();
}
public void registerSpoon(Spoon spoon) {
spoons.put(spoon.getName(), spoon);
}
}
```
```java
public static void main(String[] args) {
SpoonFactory factory = new SpoonFactory();
factory.registerSpoon(new WoodenSpoon("wooden"));
Spoon woodenSpoon = factory.createSpoon("wooden");
Spoon anotherWoodenSpoon = factory.createSpoon("wooden");
System.out.println(woodenSpoon == anotherWoodenSpoon); // false
}
```