原型模式(Prototype)

定义

用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。

本质

克隆生成对象

克隆是手段,目的是生成对象实例。

登场角色

  • 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方法会比较麻烦,必须要能够递归的让所有的相关对象都要正确的实现克隆。

何时使用

  • 如果一个对象想要独立于他所使用的对象时,可以使用原型模式,让系统只面向接口编程,在系统需要新的对象的时候,可以通过克隆来得到。
  • 如果需要实例化的类是在运行时动态指定的,可以使用原型模式,可以通过克隆原型来得到需要的实例。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。