工作中的设计模式 —— 原型模式

简介: 原型模式是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类。通俗说法,就是将一个类作为原型,然后复制出来另一个类。

前言


原型模式是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类。

通俗说法,就是将一个类作为原型,然后复制出来另一个类。


使用场景

这么一说,是不是发现我们经常使用?

比如咱们项目中有 BO、DTO、VO,但是在开发过程中,需要各种转换,get/set,一般情况下大家都会使用 BeanUtils,将一个类的属性值 set 到另一个类的属性值中,然后返回。

当然,也有一个实体直接从头捅到尾的。

关于 BeanUtils 的 copy 方法,各个框架都提供了相关工具,不过 Java 开发手册 有指出 Apache BeanUtils 性能较差、也推荐了其他框架。

网络异常,图片无法展示
|

这里介绍的是使用 Cglib BeanCopier。


封装工具类

查看文档,先封装一个工具类:

public class BeanCopierUtils {
    private BeanCopierUtils() {
    }
    /**
     * 将source对象的属性拷贝到target对象中去
     *
     * @param source source对象
     * @param target target对象
     */
    public static void copyProperties(Object source, Object target) {
        BeanCopier beanCopier = BeanCopier.create(source.getClass(), target.getClass(), false);
        beanCopier.copy(source, target, null);
    }
}

看到这里是不是感觉,如果我使用 BeanCopier 比较频繁,然后每次都 create 创建对象,是不是很麻烦?


所以就想到需要用缓存!

将 BeanCopier 作为一个,在各个线程使用的时候,共享。

public class BeanCopierUtils {
    private BeanCopierUtils() {
    }
    /**
     * BeanCopier缓存
     */
    private static Map<String, BeanCopier> CACHE = new HashMap<>();
    /**
     * 将source对象的属性拷贝到target对象中去
     *
     * @param source source对象
     * @param target target对象
     */
    public static void copyProperties(Object source, Object target) {
        String cacheKey = source.getClass().getName() + target.getClass().getName();
        BeanCopier beanCopier;
        if (!CACHE.containsKey(cacheKey)) {
            // 进入到这里会创建一个BeanCopier实例并且放在缓存map中
            beanCopier = BeanCopier.create(source.getClass(), target.getClass(), false);
            CACHE.put(cacheKey, beanCopier);
        } else {
            beanCopier = CACHE.get(cacheKey);
        }
        beanCopier.copy(source, target, null);
    }
}

然后再代码中就可以欢快的使用啦!

BeanCopierUtils.copyProperties(dto, vo);

到这里,大家发现,好像就封装了一个工具类,和原型模式并没有什么关系啊。


对象的 clone

到此其实在代码中都可以使用了,不过还是要在 DTO、VO 中声明 clone 方法,这样之后使用才会更方便~

/**
 * 将当前对象转化为目标对象
 *
 * @param clazz
 * @param <T>
 * @return
 * @throws Exception
 */
public <T> T clone(Class<T> clazz) throws Exception {
    T target = clazz.newInstance();
    BeanCopierUtils.copyProperties(this, target);
    return target;
}

现在使用的时候就可以

AccountVO accountVO = accountDTO.clone(AccountVO.class);

不过也是有弊端的,比如这里使用的是泛型,我明明是 UserVO 要 Clone , 你非得传一个 AddressDTO,那我也没得办法了。

至于进一步演化,可以将 clone 抽象到公共方法中,比如给所有 DTO 创建一个 BaseDTO。

还有深拷贝这块,也需要注意。

总结


其实工作中有很多设计模式,只不过用到了,大家没有发现。

当然工作中使用的时候,都是一切为了敏捷,可能并没有定义什么 Prototype 接口之类的,但是还是要多总结。

最后,小伙伴们工作中,有使用什么设计模式,以及实际中的应用场景,欢迎留言分享。

目录
相关文章
|
2月前
|
设计模式 安全 Java
【设计模式】原型模式
【设计模式】原型模式
|
3月前
|
设计模式 Java 关系型数据库
23种设计模式 —— 原型模式【克隆羊、浅拷贝、深拷贝】
23种设计模式 —— 原型模式【克隆羊、浅拷贝、深拷贝】
|
5月前
|
设计模式 Java
Java设计模式【五】:原型模式
Java设计模式【五】:原型模式
18 0
|
6月前
|
设计模式 Java 关系型数据库
认真学习设计模式之原型模式(Prototype Pattern)
认真学习设计模式之原型模式(Prototype Pattern)
38 0
认真学习设计模式之原型模式(Prototype Pattern)
|
5月前
|
设计模式 存储
二十三种设计模式全面解析-原型模式进阶之原型管理器:集中管理对象原型的设计模式之道
二十三种设计模式全面解析-原型模式进阶之原型管理器:集中管理对象原型的设计模式之道
|
20天前
|
设计模式 Java
【设计模式系列笔记】原型模式
原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而无需知道其具体类型。这种模式属于对象创建型模式,通过克隆来避免使用new关键字创建对象,提高性能和降低系统的耦合度。
32 6
|
29天前
|
设计模式 Java
小谈设计模式(10)—原型模式
小谈设计模式(10)—原型模式
|
1月前
|
设计模式 Java
23种设计模式,原型模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新的对象,而无需知道如何创建的细节。这种模式的核心思想是基于一个原型实例,通过复制这个原型来创建新的对象
25 7
|
2月前
|
设计模式 Java
设计模式之原型模式
设计模式之原型模式
|
4月前
|
设计模式 存储 JSON
Java设计模式-原型模式
原型模式也是创建对象的一种方式,它一般用在这样的场景:系统中存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂而且耗费资源。这个时候使用原型模式的克隆方式,能够节省不少时间。比如Java 类中提供的`Object clone()`就是原型模式的应用。
31 1
Java设计模式-原型模式