设计模式——原型模式

介绍

原型模式用户创建复杂的对象,同时可以保证性能。

该模式实现一个原型接口,该接口用于创建当前对象的克隆,当直接创建对象(new)代价比较大时,提供了使用该模式。即先生成一个模型,再根据使用场景将该模型克隆成多个。

意图

使用原型实例创建对象,通过复制原型创建对象。

解决

创建对象需要消耗过多的内存。

优点

  1. 提高性能

  2. 逃避构造函数的约束

缺点

  1. 使用克隆方法时需要通盘考虑,对于全新的类比较容易,但是对于已有的类不一定很容易做到。
  2. 必须实现Cloneable接口
  3. 逃避构造函数的约束

使用场景

  1. 资源优化场景

  2. 类初始化时需要非常多的资源

  3. 性能和安全要求的场景

  4. 通过new产生一个对象需要非常繁琐的数据准备

  5. 一个对象多个修改者场景

UML

示例

Prototype.java

package cn.geoaryblog.design.cretedg.prototype;

import java.util.Map;
public class Prototype implements Cloneable {
    private Integer id;
    private String name;
    private Map works;

    public Prototype(Integer id, String name, Map works) {
        this.id = id;
        this.name = name;
        this.works = works;
    }

    @Override
    public String toString() {
        return "Prototype{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", works=" + works +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Map getWorks() {
        return works;
    }

    public void setWorks(Map works) {
        this.works = works;
    }

    @Override
    protected Object clone() {
        Prototype prototype = null;
        try {
            prototype = (Prototype) super.clone();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return prototype;
    }
}

PersonPrototype.java

package cn.geoaryblog.design.cretedg.prototype;

import java.util.Map;

public class PersonPrototype extends Prototype {

    public PersonPrototype(Integer id, String name, Map works) {
        super(id, name, works);
        System.out.println("构造函数");
    }

    public String show(){
        return this.toString();
    }
}

Client.java

package cn.geoaryblog.design.cretedg.prototype;

import java.util.HashMap;
import java.util.Map;

public class Client {
    public static void main(String[] args) throws CloneNotSupportedException {
        String name = "张三";
        int id = 20;
        Map works = new HashMap();
        works.put("200810-201801", "北京");
        works.put("202001-现在", "上海");
        PersonPrototype personPrototype = new PersonPrototype(id, name, works);
        PersonPrototype person1 = (PersonPrototype) personPrototype.clone();
        PersonPrototype person2 = (PersonPrototype) personPrototype.clone();
        System.out.println(person1);
        System.out.println(person2);
        System.out.println(person1.hashCode());  // 989110044
        System.out.println(person2.hashCode());  // 424058530
        System.out.println("person1==person2?"+(person1==person2));
    }
}
posted @   Geoary  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示