Java 原始模型(Prototype)模式

一、什么是原型模式:

通过给出一个原型对象指明所要创建的对象的类型,然后通过复制这个原型对象来获取的更多的同类型的对象。

在Java语言中,支持原型模式,所有的对象都继承自Object对象,Object类提供一个clone()方法,它可以将JavaBean复制一份。所有要复制对象的类都要继承Cloneble接口,并实现继clone()方法才可以通过复制来获取自身更过的对象。如果一个对象没有实现Cloneble接口,则会抛出CloneNotSupportedException异常。

二、原型模型结构示意图:

  实现clone()方法;继承Colneable接口。

三、克隆模型的特点:

  1.克隆对象与原对象不是一个对象。

  2.克隆对象与原对象的类型是一个类型。

  3.如果equal方法重载继承重写,x.clone().equal(x)结果为true。

 1 /**
 2  * 一个商品类
 3  *
 4  * @author ZhouDX
 5  * @since 2019/3/14 22:16:15
 6  */
 7 public class Product implements Cloneable {
 8     /**
 9      * 构造函数
10      */
11     public Product(String prouductId, String prouductName, String price) {
12         this.prouductId = prouductId;
13         this.prouductName = prouductName;
14         this.price = price;
15     }
16
17     /**
18      * 构造函数
19      */
20     public Product(String prouductId, String prouductName) {
21         this.prouductId = prouductId;
22         this.prouductName = prouductName;
23         this.price = "0";
24     }
25
26     /**
27      * 商品id
28      */
29     private String prouductId;
30     /**
31      * 商品id
32      */
33     private String prouductName;
34     /**
35      * 价格
36      */
37     private String price;
38
39     public String getProuductId() {
40         return prouductId;
41     }
42
43     public void setProuductId(String prouductId) {
44         this.prouductId = prouductId;
45     }
46
47     public String getProuductName() {
48         return prouductName;
49     }
50
51     public void setProuductName(String prouductName) {
52         this.prouductName = prouductName;
53     }
54
55     public String getPrice() {
56         return price;
57     }
58
59     public void setPrice(String price) {
60         this.price = price;
61     }
62
63     @Override
64     protected Object clone() {
65         Product productClone = new Product(prouductId, prouductName);
66         productClone.setPrice(price);
67
68         return productClone;
69     }
70
71     @Override
72     public boolean equals(Object o) {
73         if (this == o) {
74             return true;
75         }
76         if (!(o instanceof Product)) {
77             return false;
78         }
79         Product product = (Product) o;
80         return Objects.equals(getProuductId(), product.getProuductId()) && Objects.equals(getProuductName(), product.getProuductName()) && Objects.equals(getPrice(), product.getPrice());
81     }
82
83     @Override
84     public String toString() {
85         return "Product{" + "prouductId=‘" + prouductId + ‘\‘‘ + ", prouductName=‘" + prouductName + ‘\‘‘ + ", price=‘" + price + ‘\‘‘ + ‘}‘;
86     }
87
88     public static void main(String[] args) {
89         Product product = new Product("201903142226", "钢铁侠", "500");
90
91         Product productClone = (Product) product.clone();
92
93         System.out.println("productClone:\n" + productClone);
94         System.out.println("product==productClone?:" + product.equals(productClone));
95         System.out.println("product.getClass()==productClone.getClass()?:" + product.getClass().equals(productClone.getClass()));
96         System.out.println("product.clone().equals(product)?"+product.clone().equals(product));
97     }
98 }

  运行结果:

三、原始模型的分类:

简单原始模型:

Prototype(抽象原始模型角色):抽象类或者一个接口,给出具体模型需要的接口。

ConcretePrototype(具体原始模型角色):继承抽象原型模型角色,被复制的对象。

Client(客户端):提出复制请求。

/**
 * 抽象原始模型角色
 *
 * @author ZhouDX
 * @since 2019/3/14 22:12:10
 */
public interface Prototype extends Cloneable {

    Prototype clone();
}

原文地址:https://www.cnblogs.com/zhoudaxing/p/10534282.html

时间: 2024-10-14 07:31:22

Java 原始模型(Prototype)模式的相关文章

Java原型模式(Prototype模式)

Prototype模式定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建. 如何使用原型模式 因为Java中的提供clone()方法来实现对象的克隆,所以Prototype模式实现一下子变得很简单.以勺子为例: public abstract class Abstrac

Java 实现原型(Prototype)模式

public class BaseSpoon implements Cloneable {//spoon 匙, 调羹 String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override protected BaseSpoon clone() throws CloneNotSupportedException { System.o

Creational模式之Prototype模式

1.意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.别名 无 3.动机 类似于linux命令中的cat fileA > fileB,实现文件的拷贝. 4.适用性 以下情况使用Prototype模式: 当一个系统应该独立于它的产品创建.构成和表示时,要使用Prototype; 当要实例化的类是在运行时刻指定时,例如,通过动态装载; 为了避免创建一个和产品类似层次平行的工厂类层次时: 当一个类的实例只能有几个不同状态组合中的一种时.建立相应数目的原型并克隆他们可能比每次用

菜鸟学设计模式系列笔记之Prototype模式(原型模式)

菜鸟学设计模式系列笔记之Prototype模式: Intent: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 Motivation:以一个已有的对象作为原型,通过它来创建新的对象. 在增加新的对象的时候,新对象的细节创建工作由自己来负责,从而使新对象的创建过程与框架隔离开来. 应用场景: (1)当一个系统应该独立于它的产品创建.构成和表示时 (2)当要实例化的类是在运行时刻指定时,例如动态加载 (3)为了避免创建一个产品类层次平行的工厂类层次时 (4)当一个类的实例只能有几个

设计模式之Prototype模式

通常我们会使用new 类名()的方法会去生成一个新的实例,但在开发过程中,有时候也会有"在不指定类名的前提下生成实例"的需求,那样,就只能根据现有实例来生成新的实例. 有三种情况,不能根据类来生成实例: 对象种类繁多,无法将它们整合到一个类中时: 难以根据类生成实例的时: 想解耦框架与生成的实例时. 不根据类来生成实例,而是根据实例来生成实例,就是Prototype模式,又叫原型模式. 实例程序是将字符串放入方框中或者加上下划线显示: Product接口 package site.wa

GOF设计模式——Prototype模式

一.什么是Prototype模式? 在编程中,我们可以使用new关键字指定类名来生成类的实例,但是有时候也会有不指定类名的前提下生成实例.因为有时候对象种类繁多,无法将它们整合到一个类中:或者,生成实例的过程过于复杂,难以根据类生成实例:又或者,想要将类与框架解耦.这时,为了能够在不使用类名的情况下生成实例,可以使用Prototype模式,Prototype模式又叫原型模式,专门做一些"复制"的操作. 二.Prototype模式思想 Client负责调用Prototype接口生成实例,

Java的MVC模式简介

Java的MVC模式简介 MVC(Model View Control)模型-视图-控制器 首先我们需要知道MVC模式并不是javaweb项目中独有的,MVC是一种软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller),即为MVC.它是一种软件设计的典范, 一.MVC与模板概念的理解 MVC本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器.使用MVC的目的是将M和V的实现代码分离,从而使同一个

Java Web开发模式

一 Java Web开发模式的变迁 1 最初的Java web服务器端编程技术是Servlet,利用Servlet就可以开发出一个Web应用程序. 2 为了解决Servlet缺陷,SUN推出了JSP技术.但是开发人员又走向了另一个极端就是完全放弃了Servlet. 在JSP页面混合使用HTML标记和java代码编写的脚本元素标记来开发Web程序.采用这种方法虽然可以编写JSP页面变得简单,直观,然而,他只适合于业务流程简单,系统规模较小的应用系统. 如果系统较大的话,就会出现两个严重的缺点: 1

Java装饰者模式

Java装饰者模式简介 一.假设有一个Worker接口,它有一个doSomething方法,Plumber和Carpenter都实现了Worker接口,代码及关系如下: 1.Worker.java package decorator; public interface Worker { public void doSomething(); } 2.Plumber.java public class Plumber implements Worker { @Override public void

Java多线程Future模式

Java多线程Future模式有些类似于Ajax的异步请求Future模式的核心在于:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑 假设服务器的处理某个业务,该业务可以分成AB两个过程,并且AB两个过程之间不需要彼此的返回结果 A过程需要1秒钟,B过程需要2秒钟,主线程其他操作2秒钟按照正常编写,程序大概需要执行5秒如果按照Future模式只需要执行2秒(取其中运行时间最久的线程的运行时间) Future模式的核心实现在于两个方面 1.多线程运行 主线程采用多线的方