標籤:
本文地址:http://www.cnblogs.com/archimedes/p/java-prototype-pattern.html,轉載請註明源地址。
原型模式
用原型執行個體指定建立對象的種類,並且通過拷貝這些原型建立新的對象。
概述
原型模式是從一個對象出發得到一個和自己有相同狀態的新對象的修正模式,該模式的關鍵是將一個對象定義為原型,並為其提供複製自己的方法。
java.lang.Object類的clone方法
參見《java中的深淺複製》
適用性
1.當一個系統應該獨立於它的產品建立、構成和表示時。
2.當要執行個體化的類是在運行時刻指定時,例如,通過動態裝載。
3.為了避免建立一個與產品類層次平行的工廠類層次時。
4.當一個類的執行個體只能有幾個不同狀態組合中的一種時。 建立相應數目的原型並複製它們可能比每次用合適的狀態手工執行個體化該類更方便一些。
參與者
1. Prototype 聲明一個複製自身的介面。
2. ConcretePrototype 實現一個複製自身的操作。
3. Client 讓一個原型複製自身從而建立一個新的對象。
原型模式的結構與使用
模式的結構中包括兩種角色:
•抽象原型(Prototype)
•具體原型(Concrete Prototype)
模式的UML類圖:
實戰部分
【例1】:實現一個複製介面,然後實現一個複製自身的操作並加以應用
1.抽象原型(Prototype): Prototype.java
public interface Prototype { public Object cloneMe() throws CloneNotSupportedException;}
2.具體原型(Concrete Prototype)_1: Cubic.java
public class Cubic implements Prototype, Cloneable{ double length, width, height; Cubic(double a, double b, double c){ length = a; width = b; height = c; } public Object cloneMe() throws CloneNotSupportedException{ Cubic object = (Cubic)clone(); return object; } }
2.具體原型(Concrete Prototype)_2 : Goat.java
import java.io.*;public class Goat implements Prototype,Serializable{ StringBuffer color; public void setColor(StringBuffer c){ color = c; } public StringBuffer getColor(){ return color; } public Object cloneMe() throws CloneNotSupportedException{ Object object = null; try{ ByteArrayOutputStream outOne = new ByteArrayOutputStream(); ObjectOutputStream outTwo = new ObjectOutputStream(outOne); outTwo.writeObject(this); ByteArrayInputStream inOne= new ByteArrayInputStream(outOne.toByteArray()); ObjectInputStream inTwo = new ObjectInputStream(inOne); object=inTwo.readObject(); } catch(Exception event){ System.out.println(event); } return object; }}
3.應用 Application.java
public class Application { public static void main(String[] args) { Cubic cubic = new Cubic(12, 20, 66); System.out.println("cubic的長、寬和高: "); System.out.println(cubic.length + "," + cubic.width + "," + cubic.height); try { Cubic cubicCopy = (Cubic)cubic.cloneMe(); System.out.println("cubicCopy的長、寬和高: "); System.out.println(cubicCopy.length + "," + cubicCopy.width + "," + cubicCopy.height); } catch(CloneNotSupportedException ex){} Goat goat = new Goat(); goat.setColor(new StringBuffer("白色的山羊")); System.out.println("goat是" + goat.getColor()); try { Goat goatCopy = (Goat)goat.cloneMe(); System.out.println("goatCopy是" + goatCopy.getColor()); System.out.println("goatCopy將自己的顏色改變成黑色"); goatCopy.setColor(new StringBuffer("黑顏色的山羊")); System.out.println("goat仍然是"+ goat.getColor()); System.out.println("goatCopy是"+ goatCopy.getColor()); } catch(CloneNotSupportedException ex){} }}原型模式的優點
•當建立類的新執行個體的代價更大時,使用原型模式複製一個已有的執行個體可以提高建立新執行個體的效率。
•可以動態地儲存當前對象的狀態。在運行時刻,可以隨時使用物件流程儲存當前對象的一個複製品。
您還可能感興趣:
java設計模式系列:
java設計模式4--建造者模式(Builder)
java設計模式3--單例模式(Singleton)
java設計模式2--抽象原廠模式(Abstract Factory)
java設計模式1--Factory 方法模式(Factory Method)
java設計模式0--設計模式簡介
java設計模式5--原型模式(Prototype)