博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式笔记 ------ 原型模式
阅读量:4588 次
发布时间:2019-06-09

本文共 2040 字,大约阅读时间需要 6 分钟。

  “复制-粘贴”应该是每个程序员最经常干的事情了。那为什么不去一个个敲出来?因为麻烦啊。如果把敲字看做创建对象时构造函数里干的事情,那“复制-粘贴”就能算是原型模式了。

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

  UML类图如下

  Prototype是一个有clone()方法的接口,其下实现的就是可以通过克隆自身的原型类。

  看一个例子,超市的同类销售套装里面包含的东西应该是一样。

  首先是接口(java里原型类可以直接实现Cloneable,也必须实现,否则系统clone()方法会抛出异常。)

public interface SellingPackage extends Cloneable{    public SellingPackage clone();}

   原型类

public class SellingPackageEntity implements SellingPackage {    private String name;    private int count;    private int price;    public SellingPackageEntity(String name, int count, int price) {        this.name = name;        this.count = count;        this.price = price;    }    public SellingPackage clone(){        SellingPackage result = null;        try {            result = (SellingPackageEntity) super.clone();        } catch (CloneNotSupportedException e) {            e.printStackTrace();        }        return result;    }    public void display() {        System.out.println(name + "中数量有" + count + ",价格" + price + "元");    }}

   客户端

public class POC {    public static void main(String[] args) {        SellingPackageEntity sellingPackage1 = new SellingPackageEntity("销售套装", 10, 99);        SellingPackageEntity sellingPackage2 = (SellingPackageEntity) sellingPackage1.clone();                sellingPackage1.display();        sellingPackage2.display();                if(sellingPackage1 == sellingPackage2){            System.out.println("两者是同一个销售套装");        }else{            System.out.println("两者不是同一个销售套装");        }    }}

 

  结果中可以看到,对象内容一样,但是并不是同一个对象。

  在原型模式中,重点在于clone,在复制的时候有的点非常重要,即是深复制浅复制。如果你想把工作电脑中的文件拷贝到个人电脑上,拷贝快捷方式一定是不可取的吧?毫无疑问的事情。在clone()方法中,只能复制值类型的成员变量,如果是引用类型的变量,就需要在方法体内再做处理了。这也是原型模式的缺点了,深复制会比较复杂。

  总结一下

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

主要解决:在运行期建立和删除原型。
何时使用: 1、当一个系统应该独立于它的产品创建,构成和表示时。 2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。 3、为了避免创建一个与产品类层次平行的工厂类层次时。 4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
如何解决:利用已有的一个原型对象,快速地生成和原型对象一样的实例。

 

转载于:https://www.cnblogs.com/adamJin/p/7099981.html

你可能感兴趣的文章
Oracle Metadata
查看>>
jquery 实现3d切割轮播图
查看>>
学习spring cloud 笔记
查看>>
字符串截取,SubString
查看>>
Android: 网络随时需要在3G和Wifi切换,网络程序需要注意
查看>>
ajax调用servlet
查看>>
IText 生成横向的doc文档
查看>>
认识了个外国友人!
查看>>
对Cookie进行增删改查
查看>>
MySQL sql语句获取当前日期|时间|时间戳
查看>>
微信支付官方SDK V3 .NET版的坑
查看>>
Python(一)list tuple dict set
查看>>
什么是死锁,简述死锁发生的四个必要条件,如何避免与预防死锁
查看>>
hdu4651(广义五边形数 & 分割函数1)
查看>>
python iter,迭代器&dict,字典详解
查看>>
python笔记1
查看>>
C语言:自定义一个查找字串的功能函数,类似于<string.h>中的strstr()
查看>>
数据库联系 创建表格:重点
查看>>
Regist
查看>>
设置磁盘配额(第二版)
查看>>