java设计模式5--原型模式(Prototype)
本文地址:http://www.cnblogs.com/archimedes/p/java-prototype-pattern.html,轉(zhuǎn)載請注明源地址。
原型模式
用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。
概述
原型模式是從一個對象出發(fā)得到一個和自己有相同狀態(tài)的新對象的成熟模式,該模式的關(guān)鍵是將一個對象定義為原型,并為其提供復(fù)制自己的方法。?
java.lang.Object類的clone方法
參見《java中的深淺克隆》
適用性
1.當(dāng)一個系統(tǒng)應(yīng)該獨立于它的產(chǎn)品創(chuàng)建、構(gòu)成和表示時。
2.當(dāng)要實例化的類是在運行時刻指定時,例如,通過動態(tài)裝載。
3.為了避免創(chuàng)建一個與產(chǎn)品類層次平行的工廠類層次時。
4.當(dāng)一個類的實例只能有幾個不同狀態(tài)組合中的一種時。 建立相應(yīng)數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實例化該類更方便一些。
參與者
1. Prototype 聲明一個克隆自身的接口。
2. ConcretePrototype 實現(xiàn)一個克隆自身的操作。
3. Client 讓一個原型克隆自身從而創(chuàng)建一個新的對象。
原型模式的結(jié)構(gòu)與使用
模式的結(jié)構(gòu)中包括兩種角色:
?抽象原型(Prototype)
?具體原型(Concrete Prototype)?
模式的UML類圖:
實戰(zhàn)部分
【例1】:實現(xiàn)一個克隆接口,然后實現(xiàn)一個克隆自身的操作并加以應(yīng)用
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.應(yīng)用?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){}} }原型模式的優(yōu)點?
?當(dāng)創(chuàng)建類的新實例的代價更大時,使用原型模式復(fù)制一個已有的實例可以提高創(chuàng)建新實例的效率。
?可以動態(tài)地保存當(dāng)前對象的狀態(tài)。在運行時刻,可以隨時使用對象流保存當(dāng)前對象的一個復(fù)制品。
您還可能感興趣:
java設(shè)計模式系列:
java設(shè)計模式4--建造者模式(Builder)
java設(shè)計模式3--單例模式(Singleton)
java設(shè)計模式2--抽象工廠模式(Abstract Factory)
java設(shè)計模式1--工廠方法模式(Factory Method)?
java設(shè)計模式0--設(shè)計模式簡介
總結(jié)
以上是生活随笔為你收集整理的java设计模式5--原型模式(Prototype)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java设计模式4--建造者模式(Bui
- 下一篇: java设计模式6--适配器模式(Ada