設計模式之Prototype——作業篇<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
今年要交作業,可是由於我這幾天沉迷於CS之中,到現在還沒寫作業,這可該怎麼辦呢,誰都知道我們老師最討厭不寫作業的學生了。嘿嘿,還好我有一門優秀的技能,那就是——Clone大法(俗稱COPY大法),正是由於擁有該技能,才能使我殘酷的鬥爭中立於不敗之地。於是我以迅雷不及眼耳盜鈴之勢拿來了張三的作業,開始運功。
說道這裏就不得不先說說什麼叫Clone?
有一個對象A,在某一時刻A中已經包含了一些有效值,此時可能會需要一個和A完全相同新對象B,並且此後對B任何改動都不會影響到A中的值,也就是說,A與B是兩個獨立的對象,但B的初始值是由A對象確定的。
好了言歸正傳,讓我們開始吧。
1、在這裏,先定義一個拷貝作業(CopyHomeWork)接口:
public interface CopyHomeWork extends Cloneable{
public String getHomeWork() ;
public void setHomeWork(String homeWork);
}
2、再定義一個作業(HomeWork)的實現類:
public abstract class HomeWork implements CopyHomeWork{
String homeWork;
public void setHomeWork(String homeWork) {
this.homeWork = homeWork;
}
public String getHomeWork() {
return this.homeWork;
}
// 典型的調用clone()代碼
public Object clone() {
Object object = null;
try {
object = super.clone();
}
catch (CloneNotSupportedException exception) {
System.err.println("*** is not Cloneable");
}
return object;
}
public abstract void DoHomeWork(); //做作業的抽象類
}
3、定義張三的作業(ZhangSanHomeWork)類:
public class ZhangSanHomeWork extends HomeWork{
public void DoHomeWork() {
System.out.println("張三作完了作業!");
}
}
4、編寫測試類:
public class TestCopyHomeWork {
public static void main(String args[]){
ZhangSanHomeWork zhangsanHomeWork = new ZhangSanHomeWork();
HomeWork myHomeWork = (HomeWork)zhangsanHomeWork.clone();
myHomeWork.DoHomeWork();
myHomeWork.setHomeWork("我正在抄作業,請勿打擾!");
System.out.println(myHomeWork.getHomeWork());
}
}
5、說明:
A:定義:用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。
B:Prototype模式允許一個對象再創建另外一個可定製的對象,根本無需知道任何如何創建的細節,工作原理是:通過將一個原型對象傳給那個要發動創建的對象,這個要發動創建的對象通過請求原型對象拷貝它們自己來實施創建。
C:Prototype模式最終演變成clone的使用。