Prototype如何使用?
设计模式是阅读源码的先修课。
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如何使用?相关推荐
- 【Spring】bean的作用域(@Scope) - singleton、prototype
已知spring 3+已拥有多种不同的作用域: singleton(默认).prototype.request.session.global session.(参考: spring中scope作用域( ...
- 细心看完这篇文章,刷新对Javascript Prototype的理解
var person={name:'ninja'}; person.prototype.sayName=function(){return this.name; } 分析上面这段代码,看看有没有问题? ...
- 几个比较冷门的prototype扩展方法:去掉html标签、去掉a标签、去掉style样式,以及判断是否为html代码的代码片段
/*去掉html标签(真正意义上去掉所有html标签包括内嵌的css样式)*/ String.prototype.stripHTML = function (isRemoveNewLine) {var ...
- javascript数组排序和prototype详解
原型的概念::原型对象里的所有属性和方法 被所有构造函数实例化出来的对象所共享,类似于java中的 static 正因为共享所以单一的操作 就会影响了全局,因此使用时需注意 基于prototype:为 ...
- 设计模式之C#实现---- ProtoType
作者: cuike519的专栏 http://blog.csdn.net/cuike519/ 该模式的意图是:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.那么首先我们应该已经有 ...
- 设计模式之原型模式(Prototype)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...
- JS 面向对象编程之原型(prototype)
微信小程序开发交流qq群 173683895 承接微信小程序开发.扫码加微信. function Person(first, last) {this.first = first;this.l ...
- Javascript - prototype、__proto__、constructor
最近看了很多文章,想要更通透的搞懂JS中的prototype.__proto__与constructor属性,从各个博主的文章里摘取了我认为可以有助于理解的一些内容,希望自己能够掌握好这一重要知识点的 ...
- js:深入prototype(下:原型重写)
//当属性和方法特别多时,编写起来不是非常方便,能够通过json的格式来编写 //因为原型重写.并且没有通过Person.prototype来指定,此时的constructor不会再指向Person而 ...
- javascript之prototype总结常用方法
//去左右空格 String.prototype.trim = function() { return this.replace(/^\s*|\s*$/g,''); } //去空格添加至数组集 ...
最新文章
- qt designer 插入图片_高清免版权免费图片素材哪里找?
- 如何用SAP Cloud for Customer的手机App创建销售订单
- mysql + IDEA + JDBC
- linux内核的I2C子系统详解1——I2C总线概览、驱动框架概览
- Vite + React 组件开发实践
- HDU_1711 Number Sequence(KMP)
- VBA实战技巧精粹013:宏代码保存工作簿的3种方法
- Spring Boot 菜鸟教程 2 Data JPA
- 【UML】免费的UML绘图工具yEd
- 广义线性模型matlab,使用广义线性模型拟合数据
- element ui 手动清除表单效验提示语
- 富途牛牛A股数据API使用基础教程
- 802.11协议wifi新加密方式WPA3介绍
- C++运算符重载(类内、外重载)
- P1244 [NOI2000] 青蛙过河(普及-)
- Linux系统简介分区基础命令(ADMIN01-2)
- sql server如何修改服务器名称,SQL Server 2014改服务器名称为(local)的方法
- grpc介绍(一)——rpc、protobuf和grpc
- 电子与计算机应用 都学什么,应用电子技术学什么 主要课程有哪些
- 门磁开关原理及相关应用