java设计模式5--原型模式(Prototype)
本文地址: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 Method)?
java設計模式0--設計模式簡介
總結
以上是生活随笔為你收集整理的java设计模式5--原型模式(Prototype)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java设计模式4--建造者模式(Bui
- 下一篇: java设计模式6--适配器模式(Ada