java原始模型模式_java設計模式--原始模型模式

簡介

原始模型模式屬于對象的創建模式。通過一個原型對象來指明要創建對象的類型,然后用復制原型對象的方法來創建出更多同類型的對象。

Java所有的類都是從java.lang.Object類繼承來的,Object類提供clone()方法對對象進行復制。一般調用clone()方法需要滿足一下條件:

1、對于任何對象x,都有:x.clone()!=x。也就是克隆的對象和原對象不是一個對象。

2、對于任何對象x,都有:x.clone().getClass()=x.getClass()。也就是克隆對象與原對象是相同的類型。

3、如果對象x的equal()方法定義恰當的話,那么x.clone().equal(x)應該成立。

原始模型模式

原始模型模式分為兩種類型:1、簡單形式;2、登記形式。下面分別解釋下這兩種類型。

簡單形式的原始模型模式類圖:

c7c6c8a24e4092e7c35d6e581a7033cc.png

這種模式的三個角色:

1、客戶角色:客戶提出創建對象的請求。

2、抽象原型:抽象角色,給出具體原型所需的接口。

3、具體原型:被復制的對象,需實現抽象原型所需要的接口。

抽象原型代碼:

public interface Prototype extendsCloneable{ public Object clone() throwsCloneNotSupportedException; }

具體原型代碼:

public class ConcrecePrototype implementsPrototype{ public Object clone() throwsCloneNotSupportedException { try{ return super.clone(); } catch(Exception e) { return null; } } }

客戶角色代碼:

public classClient { privatePrototype prototype; public void operation(Prototype example) throwsCloneNotSupportedException{ Prototype p =(Prototype) example.clone(); } }

登記形式的原始模型模型類圖:

e524929f13688224e6bdfd29bf62add9.png

這種模式的角色:

1、客戶角色:客戶提出創建對象的請求。

2、抽象原型:抽象角色,給出具體原型所需的接口。

3、具體原型:被復制的對象,需實現抽象原型所需要的接口。

4、原型管理器:創建具體原型類對象,并記錄每一個被創建的對象。

抽象原型代碼:

public interface Prototype extendsCloneable{ public Object clone() throwsCloneNotSupportedException; }

具體原型代碼:

public class ConcrecePrototype implementsPrototype{ public synchronized Object clone() throwsCloneNotSupportedException { Prototype temp = null; try{ temp = (Prototype) super.clone(); } catch(Exception e) { System.out.println("clone fail"); }finally{ returntemp; } } }

原型管理器代碼:

public classPrototypeManager { private Vector vector = newVector();

public voidadd(Prototype e){ vector.add(e); }

public Prototype get(inti){ return(Prototype) vector.get(i); } }

客戶端代碼:

public classClient { privatePrototypeManager pm; privatePrototype p;

public void registerPrototype(Prototype prototype) throwsCloneNotSupportedException{ Prototype temp =(Prototype) prototype.clone(); pm.add(temp); } }

可以看出,如果要創建的原型對象少且固定的話可以考慮使用簡單形式的原型模式。如果要創建的原型對象不固定,可以使用登記形式的原型模式。原型對象有原型管理器保管,如果其中有則直接拿出,沒有則復制并加入其中。

引深

看到這里就會想到了java中重要的話題:淺復制和深復制。

淺復制:被復制對象的所有變量都與原來對象有相同的值,而所有對其對象的引用都指向原對象。淺復制只考慮復制所考慮的對象,而不復制它所引用的對象。

深復制:被復制對象的所有變量都與原來對象有相同的值,那些引用其他對象的變量指向被復制的新對象。深復制中那些引用其他對象的變量將指向被復制過的新對象,也就是深復制把要復制的對象所引用的對象都復制了一遍。

原始模型模式的優缺點

優點:

1、? 原始模型模型模式允許動態地增加或減少產品類。由于創建產品類實例的方法是產品類內部具有的,因此,增加新產品的對整個結構沒有影響。

2、? 原始模型模式提供簡化的創建結構。工廠方法模式常常需要有一個與產品類等級相同的結構,而原始模型模式就不需要這樣。

3、? 具有給一個應用軟件動態加載新功能的能力。

4、? 產品類不需要非得有任何事先確定的等級結構,因為原始模型模式適用于任何的等級。

缺點:

原始模型模式最主要的缺點就是需要為每一個類都必須具備一個復制方法。

另外,如果在原型對象中有間接對象,可以將間接對象設置為transient不予以復制,或者自行創建出相當的同種對象。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445783.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445783.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445783.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Windows的命令行窗口運行Python時,如何清屏?

問題 如標題 解法 import os os.system("cls")參考 python實現清屏

手寫文字識別java_java 手寫文字圖片識別提取 百度API

package org.fh.util;import org.json.JSONObject;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.util.List;import java.util.Map;/*** 說明:獲取文字識別token類* from&am…

LeetCode - Easy - 191. Number of 1 Bits

Topic Bit Manipulation Description https://leetcode.com/problems/number-of-1-bits/ Write a function that takes an unsigned integer and returns the number of ‘1’ bits it has (also known as the Hamming weight). Note: Note that in some languages such …

java并行計算同步返回_Java大文本并行計算實現過程解析

Java大文本并行計算實現過程解析簡單提高文本讀取效率,使用BufferedReader是個不錯的選擇。速度最快的方法是MappedByteBuffer,但是,相比BufferedReader而言,效果不是非常明顯。也就是說,后者雖然快,但也快…

wgs utm java,Java,將經緯度轉換為UTM

Does anyone know of a way, in Java, to convert an earth surface position from lat, lon to UTM (say in WGS84)? Im currently looking at Geotools but unfortunately the solution is not obvious.解決方案I was able to use Geotools 2.4 to get something that works…

java 指定時間轉換_Java中使用Calendar進行獲取指定時間,使用SimpleDateFormat進行格式化轉換...

java中使用Calendar獲取指定的時間public class DateTranslate {/*** 獲取指定日期的間隔月份的第一天的日期* param date* param sep* return*/public static Date getMonthFirstDay(Date date, Integer sep) {Calendar cal Calendar.getInstance();cal.setTime(getThisWeekM…

java mvc 菜鳥_【java框架】SpringMVC(1)--SpringMVC入門

1.SpringMVC框架認識Spring MVC是一個基于MVC模式的Web框架,SpringMVC作為Spring中的一個模塊,它與Spring能夠無縫集成,主要用于解決企業Web開發中常見的問題:如參數接收、文件上傳、表單驗證、國際化等等。2.SpringMVC HelloWorl…

php設置cookie 域名,php如何設置cookie對整個域名有效?

php設置cookie對整個域名有效的方法:由setcookie函數讓cookie對整個域名有效,代碼為【setcookie("cookie_test", this is cookie test, time()3600,"/",“】。php設置cookie對整個域名有效的方法:默認情況下的cookie僅對…

php 配置 gd2,配置PHP對gd庫的支持

搭建zabbix的時候遇到有對PHP的需求檢測,發現沒有對gd的支持,記錄下。。。GD庫是php處理圖形的擴展庫,它提供了一系列用來處理圖片的API,使用GD庫可以處理圖片,或者生成圖片,也可以給圖片加水印。1、安裝zl…

我的世界一個程序導致JAVA,Java地位無可動搖的12個原因

如今,面對曾經在程序員中被各種新技術掩蓋直至堙滅的技術值得懷念。猶如COBOL這當年被老程序員們尊為神器的語言如今也基本沒有價值。而Java作為現代程序員的中堅力量在這點上或許會成為下一個COBOL。有關JAVA的技術賣出多少本書已經是一個很久遠的記憶了。現處中年…

php 自定義格式化,PHP自定義函數格式化json數據示例

本文實例講述了PHP自定義函數格式化json數據的方法。分享給大家供大家參考,具體如下:/*** Formats a JSON string for pretty printing** param string $json The JSON to make pretty* param bool $html Insert nonbreaking spaces and s for tabs and …

php 單選框選中事件,html中的checkbox和radio事件選擇用法詳解

radio注冊了click事件以后,神奇的是用鍵盤上的上下左右選擇時,居然會觸發鼠標事件,滾輪也會觸發,這種神奇的事情在mousedown下面是不會發生的。(webkit不能使用上下左右選擇)checkbox注冊click事件后,奇跡再次上演&…

java水文模型,分布式水文模型.ppt

分布式水文模型ppt課件第九章分布式水文模擬技術 第九章 分布式水文模擬技術 9.1 分布式水文模型的發展 9.1.1 分布式水文模型的研究進展 9.1.1.2 幾點討論 9.1.2 分布式水文模型的發展 9.2 基于DEM的流域分布式水文模型 9.2.1 流域水文過程及其數學模擬 流域水循環過程示意圖 …

php 實現的n,php 實現數據N等分。

本例給出實現3等分的代碼和運行結果。在保證&#xff0c;每一個部分都不會宕機的情況下&#xff0c;這種算法是最簡單的。否則就用一致性哈希算法。公式原理&#xff1a;求余算法: hash(object)%Nfor($i 1;$i<100;$i){$result crc32($i) % 3;echo "i:".$i . &qu…

ccf json解析 java,【求助】e4a json解析 求助大佬幫忙老看下怎么取?

[PHP] 純文本查看 復制代碼[{"title":"\u4e1c\u98ce\u7834","url":"\/tv\/QrRobH7kTGTqNX.html","star":"\u4e3b\u6f14\uff1a\u5f20\u7b11\u541b \u5f20\u94ce \u725b\u4e3d\u71d5 \u5218\u5c0f\u950b \u68a6\u6960&qu…

java 場景處理,將黃瓜場景示例作為一個場景處理

我遇到了Cucumber的問題 - 現在我正在進行移動自動化&#xff0c;并且我有使用場景輪廓的功能 - 我在場景中有一些變量&#xff1a;場景大綱&#xff1a;菜單項Given the user is on the hamburger menuAnd the language is Then menu item is Examples:| menu item | language…

mysql 5.5.23 winx64,win10下mysql 5.7.23 winx64安裝配置方法圖文教程

本文記錄了mysql 5.7.23 winx64安裝教程&#xff0c;具體內容如下Step1選擇手動下載版本解壓到自己指定的路徑上圖中的my.ini及data文件夾在壓縮包里是沒有的&#xff0c;后面需要自己添加my.ini如下&#xff0c;直接copy~然后在目錄下創建一個data文件夾Step2設置環境變量電腦…

php if !=,php If else 用法

PHP的&#xff0c;如果聲明是非常類似于其他編程語言使用if語句&#xff0c;但對于那些誰不熟悉它&#xff0c;圖片如下&#xff1a;想想你的決定作出之前&#xff0c;你去睡覺。如果你有這樣做的第二天&#xff0c;說去上班&#xff0c;上學&#xff0c;或任用&#xff0c;那么…

matlab生成均勻部分散點圖,應用halton序列生成均勻散點圖

前言一門課的作業要用RBF-DQ方法計算流場。簡單來講就是要在無網格的條件下用高精度格式實現流場的仿真計算。生成散點圖時&#xff0c;用蒙特卡洛的方法得到的散點圖分布不是很均勻&#xff0c;于是想到一種叫做halton的序列。本篇將運用halton序列生成均勻的散點圖。halton序…

php分頁頁數過多隱藏,織夢DEDE中內容頁分頁數目太多時隱藏方法

在dede程序的文章或圖集模型&#xff0c;內容頁分頁過多&#xff0c;假如分頁80頁&#xff0c;那么dede默認的內容分頁標簽{dede:pagebreak/}會把所有的分頁都顯示出來&#xff0c;這樣會撐破網頁模板&#xff0c;即使使用css控制可以解決這個撐破模板問題&#xff0c;用overfl…