目录

  • 原型模式是什么?
  • 为什么要用原型模式?

原型模式是什么?

Prototype模式:不根据类来生成实例,而是根据实例来生成新实例。

怎么理解呢?举个例子,就是比如现在我们只有两个类,球(Ball)和盒子(Box),它们都有一个属性是颜色,但是现在我不想每次创建一个新的球和盒子,都要赋值好是什么颜色的,我只想要说,红色的球或者蓝色的盒子,你直接创建好这样的对象给我。

那要怎么做呢?重点就是要有一个HashMap<String, Product>,key就是实例名,比如redBall或者blueBox,然后value就是我们一开始new好的对象,以它们作为原型,用来生成新的对象。

好了,原型有了,还有另一个重点就是怎么创建呢?这就需要全部的原型对象所在的类,都实现一个接口,拥有共同的创建方式(克隆clone)

来看看代码,这里用的例子是有两个类,分别将输入的字符串用下划线或一些字符框起来,但是至于用什么作为下划线和框起来的字符,就是各种的原型了。

  1. 管理原型的类
public class Manager {private HashMap showcase = new HashMap();public void register(String name, Product proto) {showcase.put(name, proto);}public Product create(String protoname) {Product p = (Product) showcase.get(protoname);return p.createClone();}
}
  1. 抽象原型,有复制和使用的方法
public interface Product extends Cloneable{public abstract void use(String s);public abstract Product createClone();
}
  1. 具体类,用来初始化一些具体原型对象

用类似* 和 /的字符 将输入的字符串框起来

public class MessageBox implements Product {private char decochar;public MessageBox(char decochar) {this.decochar = decochar;}@Overridepublic void use(String s) {int length = s.getBytes().length;for (int i = 0; i < length + 4; i++) {System.out.print(decochar);}System.out.println("");System.out.println(decochar + " " + s + " " + decochar);for (int i = 0; i < length + 4; i++) {System.out.print(decochar);}System.out.println("");}@Overridepublic Product createClone() {Product p = null;try {p = (Product) clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return p;}
}

用 类似~ 的字符作为下划线

public class UnderLinePen implements Product {private char ulchar;public UnderLinePen(char ulchar) {this.ulchar = ulchar;}@Overridepublic void use(String s) {int length = s.getBytes().length;System.out.println(s);for (int i = 0; i < length; i++) {System.out.print(ulchar);}System.out.println("");}@Overridepublic Product createClone() {Product p = null;try {p = (Product) clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return p;}
}

测试类

public class Test {public static void main(String[] args) {Manager manager = new Manager();UnderLinePen underLinePen = new UnderLinePen('~');MessageBox messageBox1 = new MessageBox('*');MessageBox messageBox2 = new MessageBox('/');manager.register("strong message", underLinePen);manager.register("warning box", messageBox1);manager.register("slash box", messageBox2);Product p1 = manager.create("strong message");p1.use("helloWorld");Product p2 = manager.create("warning box");p2.use("helloWorld");Product p3 = manager.create("slash box");p3.use("helloWorld");}
}

输出

为什么要用原型模式?

  1. 对象种类繁多,无法将他们整合到一个类中时
  2. 难以根据类生成实例时
  3. 想解耦框架与生成的实例时

设计模式-Prototype模式(原型模式)相关推荐

  1. 【设计模式】单例模式-生成器模式-原型模式

    前面的几种工厂模式,主要用于选择实现,这里的三种模式:单例模式.生成器模式.原型模式,主要用于生成对象,在GoF的划分中,这是创建型的五种模式(不包括简单工厂,前面提到过,这不是一个标准意义上的设计模 ...

  2. Java描述设计模式(05):原型模式

    一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. 2.模式结构 原型模式要求对象实现一个 ...

  3. Java设计模式5:原型模式

    原型模式 原型模式属于对象的创建模式,通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的用意. 原型模式结构 原型模式要求对象实现一个 ...

  4. 设计模式-创建型模式-原型模式(Java)(创建重复对象)

    目录 原型模式 1 介绍 2 实现 具体实现步骤 原型模式 原型模式(Prototype Pattern)是⽤于创建重复的对象,同时⼜能保证性能.这种类型的设计模式属于创建型模式,它提供了⼀种创建对象 ...

  5. 设计模式之【原型模式】,深入理解深拷贝与浅拷贝

    文章目录 一.什么是原型模式 二.原型模式实现方式 1.传统方式 2.原型模式 熟悉浅拷贝和深拷贝 浅拷贝实现对象克隆 深拷贝实现对象克隆 一.什么是原型模式 原型模式: 用一个已经创建的实例作为原型 ...

  6. 【设计模式自习室】原型模式

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该设计模式的详细介绍,包括: 引子,意图(大白话解释) 类图,时序图(理论规范) 该模式的代码示例: ...

  7. php设计模式原型模式,原型模式_设计模式_设计模式之原型模式 - Lane Blog

    10 8 Clicks: 6614 Date: 2014-04-21 21:48:35 Power By 李轩Lane 原型模式提取重复功能,避免了程序员喜欢复制粘贴的坏习惯.设计模式中的原型模式就是 ...

  8. 《设计模式详解》创建型模式 - 原型模式

    原型模式 4.3 原型模式 4.3.1 概述 4.3.2 结构 4.3.3 实现 4.3.4 案例 4.3.5 使用场景 4.3.6 扩展 - 深克隆 引用对象的浅克隆 实现 1:文件流 + 对象流 ...

  9. 设计模式五:原型模式

    目录 原型模式 浅克隆 深克隆 原型模式 原型模式是指:原型实例指定原型对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式的适用场景: 1.类初始化消耗资源较多 2.new产生一个对象需要非常繁 ...

  10. C++创建型模式-原型模式

    1.1 原型模式 原型模式的设计思想:在软件系统中,创建某一类型的对象,为了简化创建的过程,可以只创建一个对象,然后通过克隆的方式复制出多个相同的对象. 原型模式(Prototype Pattern) ...

最新文章

  1. ntpdate[27350]: no server suitable for synchronization found
  2. python 给定URL 如何获取其内容,并将其保存至HTML文档。
  3. ubuntu网卡问题
  4. logistic回归 简介_金融专业进!逻辑回归模型简述
  5. 树莓派2代B model 上手初体验,不用显示器,Python GPIO 点亮一颗LED
  6. dbms_xplan之display_cursor函数的使用
  7. java泛型程序设计——调用遗留代码
  8. 他们也曾在数学“苦海”里痛不欲生
  9. Spring Cloud实战Zuul统一异常处理
  10. fopen无法创建文件_Linux中一切皆文件,除了网卡
  11. Oracle数据库学习笔记(一)
  12. 编译android模拟器,编译Android模拟器(make sdk),以及错误处理
  13. Involution Inverting the Inherence of Convolution for Visual Recognition
  14. 简练网软考知识整理-风险应对措施之应急计划弹回计划权变措施
  15. 第24篇 研究WebRTC官网之生成工程文件
  16. postgresql统一把字段小写转大写
  17. 宇视摄像机实况画面不清晰排查方法
  18. 字符输入函数详解(getchar的使用)
  19. SaaS/大数据2019十大新闻出炉:我们不是“孤胆英雄”!
  20. 【Unity】自定义Untiy天空

热门文章

  1. python 生成数组_Python创建数组
  2. 挥别2021,奋进2022
  3. 【10.1算法理论部分(3)学习问题(Baum-Welch算法)】Hidden Markov Algorithm——李航《统计学习方法》公式推导
  4. 使用SqlBulkCopy批量插入,批量更新数据解决方案
  5. 新县天气预报软件测试,新县天气预报15天
  6. 07UI交互b_UX控件
  7. 服务器光信号闪红灯是什么意思,wifi光信号闪红灯什么意思
  8. 新媒体运营:如何一招实现主动引流,快速获得用户增长? 黎想
  9. DotNetBar for Windows Forms 14.0.0.15_冰河之刃重打包版发布
  10. 什么是盒模型(Box Model)