设计模式之原型模式

本文介绍了设计模式中的原型模式,包括其定义、应用场景及简单实例。通过一个Word文档的复制示例,展示了如何使用Java实现原型模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。下面我们来介绍其中一种设计模式。

   原型模式是一个创建型的模式,所谓原型就是有一个样板示例,用户可以从这个样板示例对象中复制出一个内部属性一致的对象
   被复制的示例我们称它为“原型”,原型模式适用于创建耗时的或复杂的对象,因为此时直接复制一个存在的对象会使程序运行更为高效运行。


   原型模式的使用场景:

   (1)类初始化的时候消耗很多的资源,通过原型拷贝避免这些消耗。
   (2)new对象时需要非常多的数据准备或访问权限。
   (3)一个对象要提供给其他对象访问,而且各个调用者都可能修改其值时,可以用原型模式拷贝多个对象让调用者使用。



   下面咱们先来介绍下咱们要写的东西
   1.Client客户端
   2.Prototype:抽象类或接口,具备clone(克隆)能力。
   3.具体的原型类

下面我们来做一个简单的示例:我们先创建了一个文档对象Word,在这个Word中有图片和文字,用户经过很长时间内容编辑后,打算进一步编辑,但修改后的不一定适用,所以我们要先拷贝一份,以防万一。然后再在拷贝文件上进行修改。这个要被拷贝的文档就是原型。

这个文档相当于原型类,cloneable接口代表具备克隆能力的Prototype。


public class Word implements Cloneable {
    private String text;//文本
    private ArrayList<String> image = new ArrayList<String>();//图片集合

    public Word() {
        System.out.println("word的构造方法");

    }

    @Override
    //用于克隆的方法也是实现Cloneable接口重写的方法clone()
    protected Word clone() {
        try {
            Word doc = (Word) super.clone();
            doc.image = this.image;
            doc.text = this.text;
            return doc;
        } catch (Exception e) {
            // TODO: handle exception
        }
        return null;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public ArrayList<String> getImage() {
        return image;
    }

    public void addImage(String img) {
        this.image.add(img);
    }

    /*
     * 打印文档内容
     */
    public void showWord() {
        System.out.println("word start--------------");
        System.out.println("text:" + text);
        for (String imagename : image) {
            System.out.println("iamge name:" + imagename);
        }
        System.out.println("word end--------------");
    }

}


我们通过Word这个类描述了这个文档中额基本元素:即文字和图片,这个类我们就把它看作原型,Clonebable这个接口我们把它看作Prototype:抽象类或接口,具备clone(克隆)能力。
**这里注意一下clone()方法并不是Clonebable这个接口中的方法,而是object中的方法。Cloneable接口只是作为一个文件可拷贝的标识,否则直接调用clone()方法会抛出异常。**



下面咱们再来看看客户端的代码:

public class Client {

public static void main(String[] args) {
//构建文档对象
     Word b = new Word();
     //编辑文档,添加文字图片等。
     b.setText("这是word");
     b.addImage("图片一");
     b.addImage("图片二");
     b.showWord();

     /*
      * 以原始文档为原型,开始拷贝一个新文档
      */

     Word doc2 = b.clone();
     doc2.showWord();

     /*
      * 修改拷贝的文件,不会影响原始文档
      */

     doc2.setText("这是拷贝的文本");
     doc2.showWord();

     b.showWord();

}

}
下面我们来看看运行结果:
这里写图片描述

我们可以看到doc2是b.clone()创建的,并且doc2第一次输出和b 的输出是一样的,doc2就是 b 的拷贝文件,内容相同,doc2的文本修改后不会影响到 b 的文本。这就保证了 b 的安全性。

注意一点:执行clone方法时克隆时不会执行构造方法,所以当你想在构造方法里进行某些初始化时要多留意一下。

好了,上面就是原型设计模式简单的实现。大家可以自己更深入地去研究哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值