设计模式是阅读源码的先修课。

Prototype描述了生成实例的一种场景:通过复制生成实例。

具体Demo

https://mp.weixin.qq.com/s/cnRXW5-rA195sCkgiaWsnw

角色1:client
可以通俗的理解为 负责调用

public class Manager {private HashMap<String,Product> showCase = new HashMap<>();public void register(String name,Product product){showCase.put(name,product);}public Product createProduct(String name){Product product = showCase.get(name);Product clone = product.createClone();return clone;}
}

角色2:

原型角色,负责定义方法。什么方法呢,复制现有实例,生成新实例的方法

Cloneable虽然是标记接口,但是也要实现。否则会报错

public interface Product extends Cloneable {public abstract void use();public abstract Product createClone();
}

角色3:原型的具体实现类

public class Spark implements Product {@Overridepublic void use() {System.out.println("我是会发光的 Spark");}@Overridepublic Product createClone() {try {return (Product) clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return null;}
}

为了更接近真实的使用场景,这里我们假设存在2个子类

public class Slash implements Product {@Overridepublic void use() {System.out.println("我是不一样的光 Slash  ");}@Overridepublic Product createClone() {Product clone;try {clone = (Product) clone();return clone;} catch (CloneNotSupportedException ex) {ex.printStackTrace();}return null;}
}

验证。生成实例不是最终目的,最终还是为了use

public static void main(String[] args) {Manager manager = new Manager();Slash slash = new Slash();manager.register("slash", slash);Spark spark = new Spark();manager.register("spark",spark);Product slash = manager.createProduct("slash");slash.use();Product spark1 = manager.createProduct("spark");spark1.use();}

为什么要使用这种模式呢?

理由1:当类的生成非常复杂时,这时很费力的生成好了一个实例,在其他的场景又要使用,可以考虑

理由2:解耦框架与生成的实例

想框架不依赖具体的类,就不能指定类名来生成实例,要事先注册一个原型,然后通过复制来生成新的实例

结合Template Method进行demo优化

有没有发现在上面的案例中,子类中的createClone实现是重复的?那该怎么办呢?

Prototype如何使用?相关推荐

  1. 【Spring】bean的作用域(@Scope) - singleton、prototype

    已知spring 3+已拥有多种不同的作用域: singleton(默认).prototype.request.session.global session.(参考: spring中scope作用域( ...

  2. 细心看完这篇文章,刷新对Javascript Prototype的理解

    var person={name:'ninja'}; person.prototype.sayName=function(){return this.name; } 分析上面这段代码,看看有没有问题? ...

  3. 几个比较冷门的prototype扩展方法:去掉html标签、去掉a标签、去掉style样式,以及判断是否为html代码的代码片段

    /*去掉html标签(真正意义上去掉所有html标签包括内嵌的css样式)*/ String.prototype.stripHTML = function (isRemoveNewLine) {var ...

  4. javascript数组排序和prototype详解

    原型的概念::原型对象里的所有属性和方法 被所有构造函数实例化出来的对象所共享,类似于java中的 static 正因为共享所以单一的操作 就会影响了全局,因此使用时需注意 基于prototype:为 ...

  5. 设计模式之C#实现---- ProtoType

    作者: cuike519的专栏   http://blog.csdn.net/cuike519/ 该模式的意图是:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.那么首先我们应该已经有 ...

  6. 设计模式之原型模式(Prototype)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  7. JS 面向对象编程之原型(prototype)

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. function Person(first, last) {this.first = first;this.l ...

  8. Javascript - prototype、__proto__、constructor

    最近看了很多文章,想要更通透的搞懂JS中的prototype.__proto__与constructor属性,从各个博主的文章里摘取了我认为可以有助于理解的一些内容,希望自己能够掌握好这一重要知识点的 ...

  9. js:深入prototype(下:原型重写)

    //当属性和方法特别多时,编写起来不是非常方便,能够通过json的格式来编写 //因为原型重写.并且没有通过Person.prototype来指定,此时的constructor不会再指向Person而 ...

  10. javascript之prototype总结常用方法

    //去左右空格 String.prototype.trim = function() {     return this.replace(/^\s*|\s*$/g,''); } //去空格添加至数组集 ...

最新文章

  1. qt designer 插入图片_高清免版权免费图片素材哪里找?
  2. 如何用SAP Cloud for Customer的手机App创建销售订单
  3. mysql + IDEA + JDBC
  4. linux内核的I2C子系统详解1——I2C总线概览、驱动框架概览
  5. Vite + React 组件开发实践
  6. HDU_1711 Number Sequence(KMP)
  7. VBA实战技巧精粹013:宏代码保存工作簿的3种方法
  8. Spring Boot 菜鸟教程 2 Data JPA
  9. 【UML】免费的UML绘图工具yEd
  10. 广义线性模型matlab,使用广义线性模型拟合数据
  11. element ui 手动清除表单效验提示语
  12. 富途牛牛A股数据API使用基础教程
  13. 802.11协议wifi新加密方式WPA3介绍
  14. C++运算符重载(类内、外重载)
  15. P1244 [NOI2000] 青蛙过河(普及-)
  16. Linux系统简介分区基础命令(ADMIN01-2)
  17. sql server如何修改服务器名称,SQL Server 2014改服务器名称为(local)的方法
  18. grpc介绍(一)——rpc、protobuf和grpc
  19. 电子与计算机应用 都学什么,应用电子技术学什么 主要课程有哪些
  20. 门磁开关原理及相关应用

热门文章

  1. 股票交易接口是什么?
  2. java上传视频转格式,Java实现视频格式转化
  3. wince tfp telnet
  4. cf英文名字格式好看的_格式好看的cf英语名字【三篇】
  5. 【多目标进化优化】MOEA 的分类
  6. 游戏王gx决斗学院android,游戏王gx学院决斗
  7. 可與言而不與之言,失人。不可與言而與之言,失言。知者不失人,亦不失言。
  8. 解决easyui-tabs 适应ie窗口大小显示不全的问题
  9. 基于强化学习工具箱的自适应巡航控制系统
  10. Mbed OS STM32F429 中断方式接收 ADS1256