设计模式_4_原型模式(对象的拷贝)
生活随笔
收集整理的這篇文章主要介紹了
设计模式_4_原型模式(对象的拷贝)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原形模式(PrototypePattern, 創建型模式,創建重復對象且保證性能, 對象的克隆)
通常使用原型模式創建一個原型接口, 用于獲取創建對象的克隆, 對于淺拷貝與深拷貝不用糾結, 他們二者的區別就在于重寫Clonable的clone方法
淺拷貝與深拷貝
淺拷貝: 直接調用Object的clone
public Object clone() {Object clone=null;try {clone=super.clone(); //不用管Object內部元素的情況直接調用Object的clone方法}catch(CloneNotSupportedException e) {e.printStackTrace();}return clone;}深拷貝: 對clone對象( 此對象內部具有數組/集合/map等復合數據 )內部的數據再進行一次克隆
此處假設clone對象內部有一個ArrayList數組, ArrayList中存儲A對象public Object clone() {Object clone=null;try {clone=super.clone();clone.getArray() = new ArrayList<A>(array.size()); //先將內部的ArrayList克隆出來for (int i=0; i < array.size(); i++){// 然后對ArrayList中的數據進行逐一克隆//從數組中獲取每個元素, 然后進行克隆, 此處A對象內部沒有復合數據, 最后將clone好的數據存入clone的array中clone.getArray().add( (A)array.get(i).clone() );}}catch(CloneNotSupportedException e) {e.printStackTrace();}return clone;} 因為只是調用Object的clone無法對克隆對象內部的數組類型進行復制, 所以還要針對拷貝對象的內部的數組再一次操作流程
- 使用方式
- 角色定義
- 使用場景
-
優點
性能提高,逃避構造函數的約束, 不推薦使用序列化處理clone -
缺點
配備克隆操作需要對類的功能全盤考慮,對已有的類不一定很容易,特別是當一個類飲用不支持串行化的間接對象,或者引用含有循環結構(對象出現多層次的引用); 必須實現Cloneable接口
代碼演示:
利用克隆, 事先將一些構造需要高代價的對象放入緩沖區, 然后在下次需要新的對象的時候直接去緩沖區拿( 緩沖區利用clone的方式給新對象, 而不是通過構造函數 )
package com.PrototypePattern;import java.util.Hashtable;public class ShapePrototypePattern {public static void main(String[] args) {//設計一個圓形的緩沖區Shape shape = new Circle();shape.setId("1");ShapeCache.loadCache(shape);//使用對應的圖形緩沖區獲得克隆對象clone, clone1, clone2Shape clonedShape=ShapeCache.getShape("1");System.out.println("Shape: "+clonedShape.hashCode());Shape clonedShape1=ShapeCache.getShape("1");System.out.println("Shape: "+clonedShape1.hashCode());Shape clonedShape2=ShapeCache.getShape("1");System.out.println("Shape: "+clonedShape2.hashCode());}} //針對不同的圖形設計不同的緩沖區模塊克隆模塊 class ShapeCache{private static Hashtable<String,Shape>shapeMap=new Hashtable<String,Shape>();//使用get方法獲得的圖形都是原圖形的克隆對象public static Shape getShape(String id) {Shape cachedShape=shapeMap.get(id);return (Shape)cachedShape.clone();}//將new出的對象放入Hashtable, 獲得相應的圖形直接獲取clonepublic static void loadCache(Shape shape) {shapeMap.put(shape.getId(), shape);} }//原型角色,實現Cloneable接口,調用Object的clone方法 //當具體實現類需要clone的時候就可以直接調用clone abstract class Shape implements Cloneable{private String id;protected String type;abstract public void draw(); public String getType() {return type;}public String getId() {return id;}public void setId(String id) {this.id=id;}public Object clone() {Object clone=null;try {clone=super.clone();}catch(CloneNotSupportedException e) {e.printStackTrace();}return clone;} }class Circle extends Shape{public Circle() {type="Circle";}@Overridepublic void draw() {System.out.println("Circle");} } class Rectangle extends Shape{public Rectangle() {type="Rectangle";}@Overridepublic void draw() {System.out.println("Rectangle");} } class Square extends Shape{public Square() {type="Square";}@Overridepublic void draw() {System.out.println("Square");} }結語:
原型模式就是clone, 用于提高性能, 避免構造對象的時候加大資源的開銷
上面有錯, 還請指出, 如果認為我寫的還不錯, 還請點個贊, 多多支持一下, O(∩_∩)O~~
總結
以上是生活随笔為你收集整理的设计模式_4_原型模式(对象的拷贝)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php外卖系统源码单店,网上订餐系统 v
- 下一篇: 设计模式_1_工厂模式与抽象工厂