欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

23种常用设计模式之原型模式

程序员文章站 2022-06-13 07:57:54
...

说明

原型模式(Prototype Pattern)是一种创建型模式,用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

应用场景

  • 在需要一个类的大量对象的时候,使用原型模式是最佳选择,因为原型模式是在内存中对这个对象进行拷贝,要比直接new这个对象性能要好很多,在这种情况下,需要的对象越多,原型模式体现出的优点越明显。
  • 如果一个对象的初始化需要很多其他对象的数据准备或其他资源的繁琐计算,那么可以使用原型模式。
  • 当需要一个对象的大量公共信息,少量字段进行个性化设置的时候,也可以使用原型模式拷贝出现有对象的副本进行加工处理。

模式特征

  • 实现了Cloneable接口
  • 可重写clone()函数,实现定制化克隆

代码实现

  • 原型实现
@Getter
@Setter
public class Computer implements Cloneable{
    /**
     * 名字
     */
    private String name;
    /**
     * CPU
     */
    private String cpu;
    /**
     * 显卡
     */
    private String graphicsCard;

    /**
     * 内存
     */
    private String memory;

    /**
     * 主板
     */
    private String mainBoard;

    /**
     * 显示器
     */
    private String screen;

    /**
     * 键盘
     */
    private String keyboard;

    /**
     * 电源
     */
    private String powerSupply;

    /**
     * 机箱
     */
    private String box;

    @Override
    protected Computer clone() throws CloneNotSupportedException {
        return (Computer) super.clone();
    }
}
  • 测试代码
public class Client{
    public static void main(String[] args) throws CloneNotSupportedException {
            Computer computer = new Computer();
            computer.setName("华为");
            computer.setCpu("CPU");
            computer.setGraphicsCard("显卡");
            computer.setMainBoard("内存");
            computer.setMainBoard("主板");
            computer.setBox("机箱");
            computer.setKeyboard("键盘");
            computer.setScreen("显示器");
            computer.setPowerSupply("电源");
    
            Computer computer1 = computer.clone();
            System.out.println(computer1.getName());//克隆时保存原有属性
            computer1.setName("联想");//针对部分属性做更改
            System.out.println(computer1.getName());
        }
}

优缺点

优点:
  • 性能提高
  • 逃避构造函数的约束。
缺点:
  • 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。
  • 必须实现 Cloneable 接口。