原型模式

克隆以后我就成了你——探究原型模式 孙悟空拔一根毫毛就可以变出好多一模一样的孙悟空!!!中国的克隆技术其实是世界领先的! 即便Jungle读书少,Jungle也清晰地记得中学生物课本上提到过的克隆羊“多利”。虽然多利寿命不长,但它的出现对“克隆(Clone)”技术意义重大。克隆,直观说就是从原有生物体上取体细胞,然后无性繁殖出有完全相同基因的个体或种群。这么说来中国的克隆技术其实是世界领先的,因为孙悟空拔一根毫毛变出许多一模一... 阅读详情

原型模式

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

介绍

意图:

  • 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

主要解决:

  • 在运行期建立和删除原型

何时使用:

  • 当一个系统应该独立于它的产品创建,构成和表示时

  • 当要实例化的类是在运行时刻指定时,例如,通过动态装载

  • 为了避免创建一个与产品类层次平行的工厂类层次时

  • 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些

如何解决:

  • 利用已有的一个原型对象,快速地生成和原型对象一样的实例

关键代码:

  • 实现克隆操作,在 JAVA 继承 Cloneable,重写 clone(),在 .NET 中可以使用 Object 类的 MemberwiseClone() 方法来实现对象的浅拷贝或通过序列化的方式来实现深拷贝

  • 原型模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些"易变类"拥有稳定的接口

应用实例:

  • JAVA 中的 Object clone() 方法

优点:

  • 性能提高

  • 逃避构造函数的约束

缺点:

  • 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候

  • 必须实现 Cloneable 接口

使用场景:

  • 资源优化场景

  • 类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等

  • 性能和安全要求的场景

  • 通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式

  • 一个对象多个修改者的场景

  • 一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用

  • 在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。原型模式已经与 Java 融为浑然一体,大家可以随手拿来使用

注意事项:

  • 与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝实现 Cloneable,重写,深拷贝是通过实现 Serializable 读取二进制流

实现

我们将创建一个抽象类 Shape 和扩展了 Shape 类的实体类。下一步是定义类 ShapeCache,该类把 shape 对象存储在一个 Hashtable 中,并在请求的时候返回它们的克隆
在这里插入图片描述

  1. 创建一个实现了 Cloneable 接口的抽象类
    //Shape.java
    public abstract class Shape implements Cloneable {

       private String id;
       protected String type;

       abstract void draw();

       public String getType(){
          return type;
       }

       public String getId() {
          return id;
       }

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

       public Object clone() {
          Object clone = null;
          try {
             clone = super.clone();
          } catch (CloneNotSupportedException e) {
             e.printStackTrace();
          }
          return clone;
       }
    }
  1. 创建扩展了上面抽象类的实体类
    //Rectangle.java
    public class Rectangle extends Shape {

       public Rectangle(){
         type = "Rectangle";
       }

       @Override
       public void draw() {
          System.out.println("Inside Rectangle::draw() method.");
       }
    }

    //Square.java
    public class Square extends Shape {

       public Square(){
         type = "Square";
       }

       @Override
       public void draw() {
          System.out.println("Inside Square::draw() method.");
       }
    }

    //Circle.java
    public class Circle extends Shape {

       public Circle(){
         type = "Circle";
       }

       @Override
       public void draw() {
          System.out.println("Inside Circle::draw() method.");
       }
    }
  1. 创建一个类,从数据库获取实体类,并把它们存储在一个 Hashtable 中
    //ShapeCache.java
    import java.util.Hashtable;

    public class ShapeCache {

       private static Hashtable<String, Shape> shapeMap
          = new Hashtable<String, Shape>();

       public static Shape getShape(String shapeId) {
          Shape cachedShape = shapeMap.get(shapeId);
          return (Shape) cachedShape.clone();
       }

       // 对每种形状都运行数据库查询,并创建该形状
       // shapeMap.put(shapeKey, shape);
       // 例如,我们要添加三种形状
       public static void loadCache() {
          Circle circle = new Circle();
          circle.setId("1");
          shapeMap.put(circle.getId(),circle);

          Square square = new Square();
          square.setId("2");
          shapeMap.put(square.getId(),square);

          Rectangle rectangle = new Rectangle();
          rectangle.setId("3");
          shapeMap.put(rectangle.getId(),rectangle);
       }
    }
  1. PrototypePatternDemo 使用 ShapeCache 类来获取存储在 Hashtable 中的形状的克隆
    //PrototypePatternDemo.java
    public class PrototypePatternDemo {
       public static void main(String[] args) {
          ShapeCache.loadCache();

          Shape clonedShape = (Shape) ShapeCache.getShape("1");
          System.out.println("Shape : " + clonedShape.getType());

          Shape clonedShape2 = (Shape) ShapeCache.getShape("2");
          System.out.println("Shape : " + clonedShape2.getType());

          Shape clonedShape3 = (Shape) ShapeCache.getShape("3");
          System.out.println("Shape : " + clonedShape3.getType());
       }
    }
  1. 创建一个 Meal 类,带有上面定义的 Item 对象
    //Meal.java
    import java.util.ArrayList;
    import java.util.List;

    public class Meal {
       private List<Item> items = new ArrayList<Item>();

       public void addItem(Item item){
          items.add(item);
       }

       public float getCost(){
          float cost = 0.0f;
          for (Item item : items) {
             cost += item.price();
          }
          return cost;
       }

       public void showItems(){
          for (Item item : items) {
             System.out.print("Item : "+item.name());
             System.out.print(", Packing : "+item.packing().pack());
             System.out.println(", Price : "+item.price());
          }
       }
    }
  1. 创建一个 MealBuilder 类,实际的 builder 类负责创建 Meal 对象
    //MealBuilder.java
    public class MealBuilder {

       public Meal prepareVegMeal (){
          Meal meal = new Meal();
          meal.addItem(new VegBurger());
          meal.addItem(new Coke());
          return meal;
       }

       public Meal prepareNonVegMeal (){
          Meal meal = new Meal();
          meal.addItem(new ChickenBurger());
          meal.addItem(new Pepsi());
          return meal;
       }
    }
  1. BuiderPatternDemo 使用 MealBuider 来演示建造者模式(Builder Pattern)
    //BuilderPatternDemo.java
    public class BuilderPatternDemo {
       public static void main(String[] args) {
          MealBuilder mealBuilder = new MealBuilder();

          Meal vegMeal = mealBuilder.prepareVegMeal();
          System.out.println("Veg Meal");
          vegMeal.showItems();
          System.out.println("Total Cost: " +vegMeal.getCost());

          Meal nonVegMeal = mealBuilder.prepareNonVegMeal();
          System.out.println("\n\nNon-Veg Meal");
          nonVegMeal.showItems();
          System.out.println("Total Cost: " +nonVegMeal.getCost());
       }
    }
Java 原型模式 文章目录原型模式原型模式Demo使用原型模式的好处浅克隆和深克隆浅克隆深克隆 原型模式 原型模式属于创建型模式,用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象!(但是学姐是不可复制的哦,只有我这里有,还不赶快关注我的 Java精选频道 ) 原型模式Demo 下了几次棋,学弟把学姐征服了多少次?这里是以次为单位,我们需要把这个枢纽创建出来,为下棋计单位! /** * 枢纽:... 阅读详情

相关推荐

5G NR PDCCH实战解析:从DCI格式到CORESET配置的完整指南

本文深入解析5G NR PDCCH的实战配置,涵盖DCI格式选择、CORESET配置及Search Space优化等关键内容。基于3GPP R16标准,提供现网部署中的典型问题解决方案,如覆盖边缘失步、多用户调度冲突等,帮助提升控制信令传输效率。特别针对5G NR PDCCH的灵活资源分配和自适应编码机制进行详细探讨。

weixin_29231263的博客 501

终-模式总结

创造性模式 创造型模式抽象了实例化的过程。它们帮助一个系统独立于如何创建、组合和表示他的那些对象。创造性模式都会将关于该系统使用哪些具体的类的信息封装起来。允许客户用结构和功能差别很大的”产品“对象配置一个系统。配置可以是静态的,即在编译时指定,也可以是动态的,就是运行时再指定。 抽象工厂:提供一个创建一系列或相关依赖对象的接口,而无需指定它们具体的类。 创造型模式隐藏了这些类的实例是如何被创造和放在一起,整个系统关于这些对象所知道的是由抽象类所定义的接口。这样,创造型模式在创建了什么,谁创建它,它是怎么

qq_40776361的博客 147

汽车底盘技术解析:从悬架调校到智能化,如何评价国产车底盘实力

汽车底盘作为决定车辆驾驶质感、安全性和耐久性的核心系统,其技术内涵远不止于悬架结构。从行驶系、转向系到制动系的协同工作,底盘调校是一门融合机械原理与工程实践的艺术。在电动化与智能化浪潮下,底盘技术正经历从被动适应到主动响应的变革,CDC可变阻尼减震器和空气悬架等技术的应用,让底盘具备了通过OTA升级实现性能优化的可能。国产汽车品牌如奇瑞、吉利等,通过平台化架构研发与调校经验积累,正推动底盘技术从“能用”向“好用”乃至“塑造独特驾驶风格”迈进。理解底盘技术,需超越简单的结构对比,关注其在实际路况中的滤震性、支

weixin_34413103的博客 387

原型模式介绍

文章目录1、定义与特点定义优点缺点2、结构与实现2.1、模式的结构2.2、模式的实现浅克隆模式深克隆模式3、应用场景参考 1、定义与特点 定义 ​ 原型(Prototype)模式,用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。例如,Windows 操作系统的安装通常较耗时,如果复制就快了很多。在生活中复制的例子非常多,这里不一一列举了。 优点 Java自带的原型模式基于内

FanGer的博客 1798

智算中心建设全流程指南:从规划到落地

智算中心的建设是一个复杂而系统的过程,涉及选址、立项、办理相关手续、设计、土建、机电安装、调试、验收等多个环节。每个环节都需要充分考虑各种因素,并注意相关的事项,以确保智算中心的顺利建设和高效运行

数据中心全生命周期价值管理 3402

Win10内网离线安装NET3.5,绝对成功,保姆级

今天工作安装工具软件套装3.5组件!也在csdn上找了很多方法躺了很多坑,我总结如下! 其实就一条,什么版本的win10装什么版本的net3.5 我的电脑是1909版本,用2004H2的镜像是没有用的,dism组件报错8024402C 所以我下载1909镜像挂在虚拟光驱 ,管理员模式下powershell dism.exe /online /enable-feature /featurename:NetFX3 /Source:E:\sources\sxs dism.exe /online /en..

唉呀妈呀脑瓜疼 6万+

设计模式:原型模式|菜鸟教程

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

菜鸟的学习笔记 2758

人工智能入门系列之一: 鸢尾花(Iris)多分类的神经网络详解及代码实现

这是最好的时代,我们一起来打造属于自动驾驶汽车上路、无人机飞天、智能机器人管工厂的AI未来 人工智能领域分化为两个阵营:其一是规则式(rule-based)方法,在人工智能早期占主峰;其二是神经网络(neural network)方法,后起之秀。随着硬件水平的提高,算力的指数式增长;人工智能的重心已经从规则式的专家时代转移到神经网络的数据时代。 “神经网络”不选择把人脑熟稔的逻辑规则传授给计算机...

NLP家的码奴小荷的博客 2万+

详解原型模式

原型模式是一种创建型设计模式,其核心思想是通过复制现有的对象来创建新的对象,而不是通过传统的构造函数来创建对象。这种模式允许用户指定创建对象的种类,并通过拷贝这些原型来创建新的对象。 原型模式的主要优点包括: 提高性能:通过复制现有对象,可以避免重复创建对象的开销,特别是在需要频繁创建相似对象的场景中,原型模式能够显著提高性能。 简化对象创建过程:不需要知道具体的类信息,只需复制一个已经存在的实例即可创建新对象,从而简化了对象的创建过程。 原型模式适用于以下场景: 创建成本高或复杂的对象:当对象的创建

如无必要,勿增实体。 1537

海康VisionMaster表面缺陷滤波实战:从参数调优到工业检测避坑指南

本文深入探讨海康VisionMaster表面缺陷滤波技术在工业检测中的应用,从参数调优到ROI绘制与Blob分析的协同策略,提供金属外壳、锂电池铝壳等复杂表面的缺陷检测实战指南。通过多级滤波架构和动态ROI生成法,显著提升检出率至98.7%,误检率低于0.5%,为工业质检提供智能化解决方案。

ujm5678901的博客 330

【Tessy】集成测试小白入门指导

本文详细介绍了如何进行集成测试的小白入门指导,从新建工程到设计用例,实现集成测试的过程详细步骤

qq_37282365的博客 1194

JAVA设计模式——【原型模式】

原型模式 克隆羊问题 现在有一只羊 tom,姓名为: tom,年龄为:1,颜色为:白色,请编写程序创建和 tom羊属性完全相同的10只羊。 传统方式解决克隆羊问题 思路分析(图解) 代码演示: public class Sheep { private String name; private int age; private String color; public Sheep(String name, int age, String color) { super(); .

龍弟-idea的博客 7956

[自动化工具] 解放双手的利器:「自动邮件平台」工具助你高效搞定重复通知任务

摘要:自动邮件平台是一款零门槛自动化工具,帮助用户高效处理重复性邮件任务。该平台支持两种调度模式(指定日期和间隔天数),无需编码即可快速设置账单提醒、活动通知等任务。提供免费托管版(小时级调度)和自主部署版(分钟级调度),满足不同精度需求。典型应用场景包括客户跟进、系统监控等周期性任务。用户只需三步即可完成设置,还能扩展定制化功能。该工具让非技术人员也能轻松实现邮件自动化,释放时间专注更重要的工作。

每日出拳老爷子的博客 111

【原型模式】原型模式深入分析

原型模式深入分析,浅拷贝,深拷贝

乘风破浪的程序猿 464

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

设计模式之原型模式

采用 “原型模式” 重构邮件类 Mail,使每次发送新的邮件时,不用new 创建新的Mail 对象,2)复杂的依赖场景, 比如,F 对象的创建依赖 A,A 又依赖 B,B 又依赖 C……不采用设计模式,实现发送广告信,每次发送邮件时,需要new 创建一个新的Mail对象,同的工厂等级结构(具体工厂对应具体产品),而原型模式就不需要这样,原型模式的。产品复制是通过封装在原型类中的克隆方法实现的,无须专门的工厂类来创建产品。1)当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过复制一。

liang8999的博客 1579

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

对原型模式的理解

如User的ak字段。

南七行者的博客 742

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

原型模式的优点

测试原型模式的效率 package cn.com.prototype; public class TestPrototypeEfficiency { public static void testNew(int count) { long start = System.currentTimeMillis(); for (int i = 0; i < ...

weixin_44007988的博客 1322
上一篇: Spring容器的基本实现
下一篇: 适配器模式
炒栗子不加糖
博客等级 码龄10年 68粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值