设计模式之原型模式

什么是设计模式
设计模式是经常使用、大多数人知道,有特定目录的代码设计经验。设计模式可以提高代码可维护性,可提升代码运行效率,也能提高系统可靠性。设计模式可以分为三类,分别是创建型、结构型和行为型。以下就原型模式简要概述。

什么是原型模式
原型模式就是实际运用中以一个对象作为原型,我们需要使用时直接获取它的克隆,以提升系统性能。原型模式也是属于创建型模式,是创建对象的最佳实现。

使用场景
需要重复创建对象的情况,需要优化系统资源性能的情况;原型模式一般和工厂模式结合使用。

小试牛刀
假如当前业务需要大量使用同一个对象,但是使用过程又不能修改原始对象,这个使用我们可以使用原型模式。
比如:业务需要对Student对象频繁创建并使用
在这里插入图片描述

1、定义一个实体CloneEntity父类并实现Cloneable

/**
 * clone
 * @author senfel
 * @version 1.0
 * @date 2022/8/12 14:03
 */
public class CloneEntity implements Cloneable{

    public Object clone(){
        try {
            return super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
}

2、创建Student实体并继承CloneEntity

/**
 * 学生对象
 * @author senfel
 * @version 1.0
 * @date 2022/8/12 13:44
 */
public class Student extends CloneEntity{

    public Student(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    /**
     * ID
     */
    private Integer id;
    /**
     * 姓名
     */
    private String name;

    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;
    }
}

3、提供一个缓存对象的实体,并提供缓存、提取对象的方法

/**
 * 对象缓存
 * @author senfel
 * @version 1.0
 * @date 2022/8/12 13:52
 */
public class ObjectCache<T extends CloneEntity> {

    /**
     * 临时缓存
     */
    private Map<String,T> map = new HashMap<>();

    /**
     * 缓存对象
     * @param obj
     */
    public void addCache(T obj){
        map.put(obj.getClass().getName(),obj);
    }

    /**
     * 获取对象
     * @param className
     * @return
     */
    public T getObj(String className){
        T t = map.get(className);
        System.err.println("原始对象:"+t);
        Object clone = t.clone();
        System.err.println("当前对象:"+clone);
        return (T)clone;
    }
}

4、愉快的创建多个对象

/**
 * 原型模式测试
 * @author senfel
 * @version 1.0
 * @date 2022/8/12 13:58
 */
@SpringBootTest
public class TestPrototypeMedel {

    @Test
    public void test(){
        ObjectCache<Student> studentObjectCache = new ObjectCache<>();
        studentObjectCache.addCache(new Student(1,"senfel"));
        //获取对象
        Student obj = studentObjectCache.getObj("pub.iit.testdemo.prototype.Student");
        Student obj2 = studentObjectCache.getObj("pub.iit.testdemo.prototype.Student");
        Student obj3 = studentObjectCache.getObj("pub.iit.testdemo.prototype.Student");
        Student obj4 = studentObjectCache.getObj("pub.iit.testdemo.prototype.Student");
        Student obj5 = studentObjectCache.getObj("pub.iit.testdemo.prototype.Student");

    }
}

测试结果:
原始对象:pub.iit.testdemo.prototype.Student@7b3c2ae0
当前对象:pub.iit.testdemo.prototype.Student@5d3b6585
原始对象:pub.iit.testdemo.prototype.Student@7b3c2ae0
当前对象:pub.iit.testdemo.prototype.Student@41059616
原始对象:pub.iit.testdemo.prototype.Student@7b3c2ae0
当前对象:pub.iit.testdemo.prototype.Student@2e93108a
原始对象:pub.iit.testdemo.prototype.Student@7b3c2ae0
当前对象:pub.iit.testdemo.prototype.Student@34e25492
原始对象:pub.iit.testdemo.prototype.Student@7b3c2ae0
当前对象:pub.iit.testdemo.prototype.Student@32f308c6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小沈同学呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值