設計模式之原型模式
一.定義
原型模式:原型模式用于創建重復的對象,實現對象的拷貝。這種模式類似于創建型模式,提供了創建對象的最佳模式。
這種模式存在的應用場景在于,能夠復制當前對象,實現對象數據的克隆。比如:如果一個對象的數據需要經過較高代價的數據庫操作,采用原型模式能夠較好的緩存當前對象,減少數據庫的訪問量。
二.使用場景
思想:用實例對象,指導對象的創建工作.
應用:1.一個復雜的對象,包含多種數據和結構,層次較深時,適用與原型模式(當需要創建一個與復雜對象部分數據相同的對象)
2.當復雜對象需要獨立于系統運行,而不破壞本系統中的結構
實例場景:1.一個樓盤有名稱,地址和施工隊三個成員變量。施工隊有名稱,人數和包工頭。包工頭有名稱和年齡。現在要建設一個隔壁的樓盤,還是由這個施工隊進行建設的,只是地址不同。
如果重新創建,過程較為復雜,費時費力,采取原型模式可以快速構建一個新的樓盤
2.系統中已經有一架飛機,飛機有名稱和型號和廠商。廠商有名稱,地址和負責人。負責人有姓名和年齡。現在要一家相同的飛機由不同的負責人進行指導生產的,如何快速創建這樣的對象。
三.優缺點
優點:1.快速創建復雜對象實例 2.逃避構造函數約束
缺點:1.引用含有循環引用如何處理 2.必須實現Cloneable接口
下面是一張UML圖用來說明原型模式的關系

下面是一個具體的應用場景:
如何實現不投的型號的手機由相同的工廠生產的問題,快速創建這樣的一個對象

結構:手機由名稱,價格,生產工廠組成。生產工廠由工程師和名稱組成。工程師由姓名這個基本屬性。
現在為了快速復制同一工廠的不同手機,解決這一實際應用場景。
Phone類
public class Phone { public String name; //手機名稱 public float price; //價錢 public Factory factory; //工廠 @Override public String toString() { return "手機名稱:"+this.name+" 價錢:"+this.price+this.factory.toString(); } public Phone Clone(){ Phone phone =null; try{ phone=new Phone(); if(this.name!=null){ phone.name=this.name; } if(this.price!=0){ phone.price=this.price; } if(this.factory!=null){ phone.factory=this.factory.Clone(); } }catch (Exception e){ new RuntimeException(e); } return phone; } }
Factory類
public class Factory implements Cloneable{ public String name; //工廠名稱 public Person Manager; //負責人 @Override public String toString() { return " 工廠名稱:"+this.name+" 負責人:"+Manager.toString(); } public Factory Clone(){ Factory factory =null; try{ factory=new Factory(); if(this.name!=null){ factory.name=this.name; } if(this.Manager!=null){ factory.Manager=this.Manager.Clone(); } }catch (Exception e){ new RuntimeException(e); } return factory; } }
Person類
public class Person implements Cloneable{ public String name; //名稱 @Override public String toString() { return this.name; } public Person Clone(){ Person person =null; try{ person =new Person(); person.name=this.name; }catch (Exception e){ new RuntimeException(e); } return person; } }
然后生產一部榮耀一部分華為
public class Main { public static void main(String[] args) { Phone phone =new Phone(); phone.name="Honor"; phone.price=new Float(1.5); phone.factory=new Factory(); phone.factory.name="三星工廠"; Person person =new Person(); person.name="郭臺銘"; phone.factory.Manager=person; Phone phone1 =phone.Clone(); phone1.name="華為"; System.out.println(phone.toString()); System.out.println(phone1.toString()); } }
運行結果:

顯然實現了對象的深復制,解決了對象克隆問題。

浙公網安備 33010602011771號