设计模式再探——原型模式

简介: 设计模式再探——原型模式

一、背景介绍

最近在做业务实现的时候,为了通过提升机器来降低开发人员的难度和要求,于是在架构设计上严格按照面向对象去做的。

进而在内存中同一个类处理业务的对象就会很多,为了解决对象复制过程中降低耦合的要求,研究了原型模式

二、思路&方案

  • 1.原型模式简介
  • 2.原型模式的类图
  • 3.原型模式代码
  • 4.原型模式深度剖析
  • 5.原型模式与spring

三、过程

1.原型模式简介

原型模式(ProtoTYpe),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

2.原型模式的类图

3.原型模式代码

package com.a7DesignPattern.a1CreatType.a4Prototype;
/**
 * 功能描述:浅复制client
 *
 * @Author:makang
 * @Date: 2021/4/30 17:21
 */
public class Client {
    public static void main(String[] args) {
        ConcretePrototype1 prototype1 = new ConcretePrototype1();
        prototype1.setId("1111111");
        ConcretePrototype1 prototype2 = (ConcretePrototype1)prototype1.clone();
        prototype2.setId("222222222");
        System.out.println(prototype2.getId());
    }
}
package com.a7DesignPattern.a1CreatType.a4Prototype;
/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/4/30 17:19
 */
public abstract class Prototype implements Cloneable {
    private String id;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
}
package com.a7DesignPattern.a1CreatType.a4Prototype;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/4/30 17:20
 */
public class ConcretePrototype1 extends Prototype{
    private String id;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    //    @Override
    public Object clone() {
        ConcretePrototype1 concretePrototype1 = null;
        try{
            concretePrototype1 = (ConcretePrototype1) super.clone();
        }catch (Exception e){
        }
        return concretePrototype1;
    }
}
package com.a7DesignPattern.a1CreatType.a4Prototype;
/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/4/30 17:21
 */
public class ConcretePrototype2 extends Prototype{
    @Override
    public Prototype clone() {
        return (Prototype) this.clone();
    }
}

4.原型模式深度剖析

原型模式中的具体原型类concretePrototype1和concretePrototype2有横向纵向两层含义:

  • 4.1.横向,可以是同一个业务的浅复制和深复制
  • 4.2.纵向,可以是不同业务的浅复制或深复制

5.原型模式与spring

  • 5.1.我们都知道如果一个类交给spring进行创建对象,并且创建出来的对象生命周期也交给spring来管理的话,必须强制为单例类;真正使用的时候则通过分时复用进行调用,当我们需要对象并发处理业务的时候我们考虑的事情就会很多。
  • 5.2.如果我们的类交给spring进行创建对象的时候,只需要将单例注解的参数修改为原型,每次从springbean中获取的对象将会是新的对象;而此时获取的新对象生命周期需要我们自己去管理。
  • 5.3.在我们的业务中,例如对于主题讨论中的回复,张三想要按照点赞排序,李四想要按照回复排序;当他们发出请求后,我们就可以通过浅复制方式,使用同一份回复内容,通过不同的对象来分别处理不同的排序结果。

四、总结

  • 1.对于原型模式的边界进行梳理过后,在实际需要的场景中运用就会更加明确
  • 2.原型模式通过统一的clone接口,使得需要复制的业务类强制按照接口规范进行实现从而保证了客户端调用的统一性
  • 3.原型模式在客户端做了父类强转子类的操作,使得生成的对象必须具备子类对应的显示调用的行为(这里也让我想到了接口隔离中的子类强转为父类,使得对象只能显示调用父类的行为)

五、升华

通过对于原型模式的梳理和再探的过程,进一步强化了面向对象中面对抽象编程和面对接口编程这件事;而通过原型模式深浅复制的不同场景的运用使得迪米特法则的落地也更加的彻底。

相关文章
|
6月前
|
设计模式 安全 Java
面向对象编程的精髓:Java设计模式 - 原型模式(Prototype)完全参考手册
【4月更文挑战第7天】原型模式是OOP中的创建型设计模式,用于通过复制现有实例创建新实例,尤其适用于创建成本高或依赖其他对象的情况。它包括Prototype接口、ConcretePrototype实现和Client客户端角色。优点是性能优化、避免子类化和动态增加产品族。实现包括定义原型接口、实现具体原型和客户端调用克隆方法。最佳实践涉及确保克隆正确性、选择深拷贝或浅拷贝及考虑线程安全。但需注意克隆方法管理、性能开销和循环引用等问题。在Java中,实现Cloneable接口和覆盖clone方法可实现原型模式。
77 4
|
6月前
|
设计模式 Java 关系型数据库
23种设计模式 —— 原型模式【克隆羊、浅拷贝、深拷贝】
23种设计模式 —— 原型模式【克隆羊、浅拷贝、深拷贝】
|
6月前
|
设计模式 安全 Java
【设计模式】原型模式
【设计模式】原型模式
|
2月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑】设计模式——原型模式
对比原型模式和传统方式的实现思路、代码方案、优缺点,阐述原型模式的使用场景,以及深拷贝、浅拷贝等相关概念,并扩展原型模式在Spring源码中的应用。
【Java笔记+踩坑】设计模式——原型模式
|
2月前
|
设计模式 Java
Java设计模式-原型模式(3)
Java设计模式-原型模式(3)
Java设计模式-原型模式(3)
|
4月前
|
设计模式
iLogtail设计模式问题之iLogtail中的原型模式是什么
iLogtail设计模式问题之iLogtail中的原型模式是什么
iLogtail设计模式问题之iLogtail中的原型模式是什么
|
4月前
|
设计模式 JavaScript
js设计模式【详解】—— 原型模式
js设计模式【详解】—— 原型模式
50 6
|
5月前
|
设计模式 Java
Java设计模式之原型模式详解
Java设计模式之原型模式详解
|
5月前
|
设计模式
原型模式-大话设计模式
原型模式-大话设计模式
|
5月前
|
设计模式 Java Spring
设计模式——原型模式
设计模式——原型模式