原型模式(Prototype)
2020-07-18 本文已影响0人
秀儿2020
定义
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
本质
克隆生成对象
克隆是手段,目的是生成对象实例。
登场角色
-
Prototype(原型)
抽象类,定义用于复制现有实例来生成新实例的方法。
-
ConcretePrototype(具体的原型)
实现复制现有实例并生成新实例的方法。
-
Client(使用者)
使用复制实例的方法生成新的实例。
示例代码
/**
* 定义复制功能的接口
*/
public interface Product extends Cloneable{
void use(String s);
Product createClone();
}
/**
* 具体的原型1
*/
public class MessageBox implements Product{
private char decochar;
public MessageBox(char s){
this.decochar = s;
}
@Override
public void use(String s) {
System.out.println("use. " + s);
}
@Override
public Product createClone() {
Product product = null;
try {
product = (Product)clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return product;
}
}
/**
* 具体的原型2
*/
public class UnderlinePen implements Product{
private char ulchar;
public UnderlinePen(char c){
this.ulchar = c;
}
@Override
public void use(String s) {
System.out.println("use. " + s);
}
@Override
public Product createClone() {
Product product = null;
try {
product = (Product)clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return product;
}
}
/**
* Client 管理现有类,并可用现有类对象创建出新的对象
*/
public class Manager {
private HashMap<String,Product> showCase = new HashMap<>();
public void register(String name,Product product){
showCase.put(name,product);
}
public Product createProduct(String prototypeName){
return showCase.get(prototypeName).createClone();
}
}
/**
* 测试
*/
public class Main {
public static void main(String args[]){
Manager manager = new Manager();
MessageBox messageBox = new MessageBox('m');
UnderlinePen underlinePen = new UnderlinePen('u');
manager.register("m",messageBox);
manager.register("u",underlinePen);
Product messageBoxClone = manager.createProduct("m");
Product underlinePenClone = manager.createProduct("u");
messageBoxClone.use("this is the messageBoxClone");
underlinePenClone.use("this is the underlineClone");
}
}
运行结果
use this is the messageBoxClone
use this is the underlineClone
功能
- 根据现有实例创建新的实例。原型模式会要求对象实现一个可克隆自身的接口,这样就可以通过克隆实例对象本身来创建一个新的对象。
- 为克隆出来的新的对象实例复制原型示例属性的值。
优点
- 封装,对客户隐藏具体的实现细节,只需要调用克隆方法就可以得到对象。
缺点
- 每个原型的子类都需要实现clone操作,尤其是在包含引用类型的对象时,clone方法会比较麻烦,必须要能够递归的让所有的相关对象都要正确的实现克隆。
何时使用
- 如果一个对象想要独立于他所使用的对象时,可以使用原型模式,让系统只面向接口编程,在系统需要新的对象的时候,可以通过克隆来得到。
- 如果需要实例化的类是在运行时动态指定的,可以使用原型模式,可以通过克隆原型来得到需要的实例。