携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情
1.意图:
- 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
- 原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。
- 原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。
2.适用性:
- 当要实例化的类是在运行时刻指定时,例如:通过动态装载
- 为了避免创建一个与产品类层次平行的工厂类层次时
- 当一个类的实例只能有几个不同状态组合中的一种时,建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
3.原型(prototype)模式的构成:
- 抽象原型类(Prototype):定义具有克隆自己的方法的接口
- 具体原型类(ConcretePrototype):实现具体的克隆方法
- 客户类(Client):通过克隆生成一个新的对象。
4.原型模式UML类图:
5.原型模式UML序列图:
6.代码示例:
抽象原型:
public abstract class Prototype {
private String id;
public Prototype(String id) {
this.id = id;
}
public String getId() {
return id;
}
public abstract Prototype clone();
}
具体原型1:
public class ConcretePrototype1 extends Prototype {
public ConcretePrototype1(String id) {
super(id);
}
@Override
public Prototype clone() {
return (ConcretePrototype1) this.clone();
}
}
具体原型2:
public class ConcretePrototype2 extends Prototype {
public ConcretePrototype2(String id) {
super(id);
}
@Override
public Prototype clone() {
return (Prototype) this.clone();
}
}
客户角色:
public class Client {
public static void main(String[] args) {
ConcretePrototype1 p1 = new ConcretePrototype1("I");
ConcretePrototype1 c1 = (ConcretePrototype1) p1.clone();
System.out.println("cloned: " + c1.getId());
ConcretePrototype2 p2 = new ConcretePrototype2("II");
ConcretePrototype2 c2 = (ConcretePrototype2) p2.clone();
System.out.println("cloned: " + c2.getId());
}
}