Java設(shè)計模式之原型模式的示例詳解

定義
用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象 即實現(xiàn)了一個原型接口,該接口用于創(chuàng)建當(dāng)前對象的克隆,當(dāng)直接創(chuàng)建對象的代價比較大時,則采用這種模式
案例
需求
張三要打印100000份照片
方案一
定義照片類
/**
* 照片類
* @author:liyajie
* @createTime:2022/2/15 11:47
* @version:1.0
*/
@Data
@AllArgsConstructor
public class Photo {
private String name;
private String type;
private int size;
}定義客戶端類
/**
* 客戶端
* @author:liyajie
* @createTime:2022/2/15 11:49
* @version:1.0
*/
public class Client {
public void printPhoto(){
Photo photo = new Photo("張三","彩色",2);
for (int i = 0; i < 100000; i++) {
Photo clone = new Photo(photo.getName(),photo.getType(),photo.getSize());
System.out.println(clone);
}
}
}定義測試類
/**
* 測試類
* @author:liyajie
* @createTime:2022/2/15 11:51
* @version:1.0
*/
public class Test {
public static void main(String[] args) {
Client client = new Client();
client.printPhoto();
}
}測試結(jié)果

方案二
定義照片類
/**
* 照片類
* @author:liyajie
* @createTime:2022/2/15 11:47
* @version:1.0
*/
@Data
@AllArgsConstructor
public class PhotoNew implements Cloneable{
private String name;
private String type;
private int size;
@Override
protected PhotoNew clone() {
PhotoNew clone = null;
try {
clone = (PhotoNew)super.clone();
}catch (Exception e){
e.printStackTrace();
}
return clone;
}
}定義客戶端類
/**
* 客戶端
* @author:liyajie
* @createTime:2022/2/15 11:49
* @version:1.0
*/
public class ClientNew {
public void printPhoto(){
PhotoNew photoNew = new PhotoNew("張三","彩色",2);
for (int i = 0; i < 100000; i++) {
PhotoNew clone = photoNew.clone();
System.out.println(clone);
}
}
}定義測試類
/**
* 測試類
* @author:liyajie
* @createTime:2022/2/15 11:51
* @version:1.0
*/
public class TestNew {
public static void main(String[] args) {
ClientNew clientNew = new ClientNew();
clientNew.printPhoto();
}
}測試結(jié)果

對比分析
- 方案一:一般實現(xiàn)方法,使用for循環(huán)進(jìn)行多次new實例化照片對象,該方案最多大的優(yōu)勢就是簡單,容易理解;劣勢就是多次使用new關(guān)鍵字,頻繁的進(jìn)行內(nèi)存分配等,如果量大到一定的程度,性能會非常差
- 方案二:原型模式實現(xiàn)方法,要實例化多次的類實現(xiàn)Cloneable,重寫clone方法,使用for循環(huán)重復(fù)調(diào)用clone方法進(jìn)行多次實例化,即是在內(nèi)存中使用拷貝的方式進(jìn)行創(chuàng)建對象,性能比new關(guān)鍵字會高很多
總結(jié)
通過以上兩個方案的耗時比較,我們可以發(fā)現(xiàn)使用原型模式創(chuàng)建對象性能最優(yōu),所以在以下場景中我們可以選擇使用原型模式:
1.當(dāng)需要一個類的大量對象的時候
2.如果一個對象初始化太過繁瑣
到此這篇關(guān)于Java設(shè)計模式之原型模式的示例詳解的文章就介紹到這了,更多相關(guān)Java原型模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java基本類型與byte數(shù)組之間相互轉(zhuǎn)換方法
下面小編就為大家?guī)硪黄狫ava基本類型與byte數(shù)組之間相互轉(zhuǎn)換方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08
Spring boot集成swagger2生成接口文檔的全過程
這篇文章主要給大家介紹了關(guān)于Spring boot集成swagger2生成接口文檔的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Eclipse下編寫java程序突然不會自動生成R.java文件和包的解決辦法
這篇文章主要介紹了Eclipse下編寫java程序突然不會自動生成R.java文件和包的解決辦法 的相關(guān)資料,需要的朋友可以參考下2016-01-01

