日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

java设计模式5--原型模式(Prototype)

發(fā)布時間:2025/3/21 asp.net 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java设计模式5--原型模式(Prototype) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文地址: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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。