設計模式系列 原型 建造者

2021-10-06 10:05:22 字數 4162 閱讀 5415

原型模式與建造者模式都屬於建立型的模式,也是比較常見的模式。

原型模式常常用於複雜物件的複製,常常將需要用到原型模式的類設計成 cloneable,這種方式實現的是淺轉殖。如果需要實現深轉殖,則需要將其成員對應的類也設計成 cloneable,並進行遞迴,這種方式比較繁瑣,通常我們使用一種簡便的方式——序列化和反序列化,採用這種方式要求我們將需要序列化的類及其成員對應的類設計成 seriable。

public

class

prototypebean

implements

cloneable

, serializable

public

prototypebean

(long id, string name)

public

prototypebean

(long id, string name, address address)

public

long

getid()

public

void

setid

(long id)

public string getname()

public

void

setname

(string name)

public address getaddress()

public

void

setaddress

(address address)

@override

public string tostring()

';}// 淺轉殖

@override

public prototypebean clone()

throws clonenotsupportedexception

// 深轉殖

public prototypebean clonedeeply()

throws exception

finally

objectinputstream ois = null;

prototypebean result;

tryfinally

return result;

}public

static

class

address

implements

cloneable

, serializable

public

void

setnation

(string nation)

public string getprovince()

public

void

setprovince

(string province)

public string getcity()

public

void

setcity

(string city)

public string getdetail()

public

void

setdetail

(string detail)

@override

protected address clone()

throws clonenotsupportedexception

@override

public string tostring()

';}}

}

以下示例中,我們有乙個表示運單的類 waybill,該類對應乙個建造者 waybillbuilder。

public

class

waybill

public

void

setbillnum

(string billnum)

public string getcargotype()

public

void

setcargotype

(string cargotype)

public string getcargoname()

public

void

setcargoname

(string cargoname)

public string getcargoweight()

public

void

setcargoweight

(string cargoweight)

public string getcargovolume()

public

void

setcargovolume

(string cargovolume)

public string getfee()

public

void

setfee

(string fee)

public entityinfo getsender()

public

void

setsender

(entityinfo sender)

public entityinfo getrecipient()

public

void

setrecipient

(entityinfo recipient)

// 收件人/發件人實體資訊類

public

static

class

entityinfo

public

void

setname

(string name)

public string getphone()

public

void

setphone

(string phone)

public string getaddress()

public

void

setaddress

(string address)

}}

public

class

waybillbuilder

public waybillbuilder setbillnum

(string billnum)

public waybillbuilder setcargotype

(string cargotype)

public waybillbuilder setcargoname

(string cargoname)

public waybillbuilder setcargoweight

(string cargoweight)

public waybillbuilder setcargovolume

(string cargovolume)

public waybillbuilder setfee

(string fee)

public waybillbuilder setsendername

(string sendername)

public waybillbuilder setsenderphone

(string senderphone)

public waybillbuilder setsenderaddress

(string senderaddress)

public waybillbuilder setrecipientname

(string recipientname)

public waybillbuilder setrecipientphone

(string recipientphone)

public waybillbuilder setrecipientaddress

(string recipientaddress)

public waybill build()

}

這兩種設計模式都用於複雜物件的建立,前者通過物件的複製來提高物件的建立效率。後者是通過隱藏物件的建立細節(通常是比較複雜,涉及一系列固定的演算法,而非簡單的對成員的賦值),降低使用者建立物件的難度。

設計模式 建造者 原型模式

建造者模式 使用多個簡單的物件一步一步構建成乙個複雜的物件。我們假設乙個快餐店的商業案例,其中,乙個典型的 可以是乙個漢堡 burger 和一杯冷飲 cold drink 漢堡 burger 可以是素食漢堡 veg burger 或雞肉漢堡 chicken burger 它們是包在紙盒中。冷飲 co...

PHP設計模式系列 建造者模式

有乙個使用者的userinfo類,建立這個類,需要建立使用者的姓名,年齡,金錢等資訊,才能獲得使用者具體的資訊結果。建立乙個userinfobuilder 使用者建造者類,這個類,將userinfo複雜的建立姓名,年齡,金錢等操作封裝起來,簡化使用者類的建立過程 建造者模式,目的是消除其它物件複雜的...

PHP設計模式系列 建造者模式

建造者模式主要是為了消除其它物件複雜的建立過程。有乙個使用者的userinfo類,建立這個類,需要建立使用者的姓名,年齡,金錢等資訊,才能獲得使用者具體的資訊結果。建立乙個userinfobuilder 使用者建造者類,這個類,將userinfo複雜的建立姓名,年齡,金錢等操作封裝起來,簡化使用者類...