-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 營銷推廣 > 專題列表 > 正文
生成器模式(生成器模式的應(yīng)用場景)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于生成器模式的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,有小程序、在線網(wǎng)頁版、PC客戶端和批量生成器
官網(wǎng):https://ai.de1919.com。
本文目錄:
JAVA中建造者模式的主要思想,方法是什么,如何設(shè)計的?
java有23種經(jīng)典設(shè)計模式,分為三類:創(chuàng)建型、結(jié)構(gòu)型和行為型。Builder,建造者,屬于創(chuàng)建型的設(shè)計模式,相同的還有工廠方法模式、抽象工廠、單例模式和原型模式。建造者模式抽象了對象的實(shí)例化過程,用來幫助系統(tǒng)去創(chuàng)建、組合和表示實(shí)例對象。建造者模式中一個常見的栗子就是StringBuilder。
建造者模式可以說是對工廠模式的擴(kuò)展,工廠類提供了生產(chǎn)單個產(chǎn)品的功能,而建造者模式則可以將各種產(chǎn)品集中起來進(jìn)行統(tǒng)一管理。工廠模式關(guān)注的是整個產(chǎn)品,建造者模式關(guān)注的是產(chǎn)品各組成部分的創(chuàng)建過程。
比如要創(chuàng)建一輛車,你只關(guān)心汽車本身(之后加以使用),就用工廠模式創(chuàng)建;若還關(guān)注該汽車的各部分是怎么造出來的(或者不同的工廠對產(chǎn)品的各部分的造法不同,就用Builder)。如StringBuilder對字符串的整合,append()、delete()、insert()改變數(shù)據(jù)。
it is in my house
23種經(jīng)典設(shè)計模式的java實(shí)現(xiàn)之生成器模式在這里我們使用一個構(gòu)建房屋的場景來說明“生成器”——builder模式的使用。
這個模式的定義是:
1、當(dāng)創(chuàng)建復(fù)雜對象的算法應(yīng)該獨(dú)立于該對象的組成部分以及它們的裝**式時。
2、當(dāng)構(gòu)造過程必須允許被構(gòu)造的對象有不同的表示時。
簡單的說,它有點(diǎn)像工廠模式,但是最終生成“產(chǎn)品”的是Director而非Factory,Director可以使用的builder來生成產(chǎn)品。而builder——生成器則遵循統(tǒng)一的接口,實(shí)現(xiàn)不同的內(nèi)容,從而達(dá)到將一個復(fù)雜對象的構(gòu)建與它的表示分離的目標(biāo)。
下面看這個實(shí)際的例子吧:
首先,這是我們最終需要生成的產(chǎn)品——房屋,它具有房間數(shù)量和門數(shù)量的屬性。
package com.alex.designpattern.builder;
/** *//**
* 最終我們需要的產(chǎn)品——房屋
*
* @author <a href="mailto:huqiyes@gmail.com">huqi</a>
* @serialData 2007
*/
public class House ...{
int roomNumber;
int doorNumber;
public House() ...{
roomNumber = 0;
doorNumber = 0;
}
public int getRoomNumber() ...{
return roomNumber;
}
public int getDoorNumber() ...{
return doorNumber;
}
}
下面就是房屋的真正構(gòu)建者——“生成器”的接口定義,以及它的一個實(shí)現(xiàn)。
package com.alex.designpattern.builder;
/** *//**
* 房屋構(gòu)建者的接口
*
* @author <a href="mailto:huqiyes@gmail.com">huqi</a>
* @serialData 2007
*/
public interface HouseBuilder ...{
public void BuildRoom(int roomNo);
public void BuildDoor(int room1, int room2);
public House getHouse();
}
package com.alex.designpattern.builder;
public class ConcreteHouseBuilderA implements HouseBuilder ...{
private House house;
public ConcreteHouseBuilderA() ...{
house = new House();
}
public void BuildRoom(int roomNo) ...{
// you can create a new Room added to a House
house.roomNumber = house.roomNumber + roomNo;
}
public void BuildDoor(int room1, int room2) ...{
// you can create a new door assotiated with 2 room
// and added this door into a house
house.doorNumber = house.doorNumber + room1 + room2;
}
public House getHouse() ...{
return house;
}
}
那么,這就是所謂的Director——最終構(gòu)建房屋的“表示者”。我們需要給它提供“生成器”,然后由它來構(gòu)建房屋。
package com.alex.designpattern.builder;
/** *//**
* 房屋(構(gòu)建)的“表示”者,通過它我們可以對同一種構(gòu)建采用不同的表示方式
*
* @author <a href="mailto:huqiyes@gmail.com">huqi</a>
* @serialData 2007
*/
public class HouseDirector ...{
public static House CreateHouse(HouseBuilder concreteBuilder) ...{
concreteBuilder.BuildRoom(1);
concreteBuilder.BuildRoom(2);
concreteBuilder.BuildDoor(1, 2);
concreteBuilder.BuildDoor(2, 1);
return concreteBuilder.getHouse();
}
}
最后,當(dāng)然是我們的測試啟動類了,可以看到,使用生成器模式的簡單過程就是:
1、創(chuàng)建生成器對象。
2、表示者使用此生成器對象構(gòu)建最終產(chǎn)品。
package com.alex.designpattern.builder;
/** *//**
* A test client to create a house <br>
* but we do not know how the room and door be created
* <p>
*
* Builder(生成器模式)
* <p>
* 將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
*/
public class Test ...{
public static void main(String[] args) ...{
ConcreteHouseBuilderA myHouseBuilder = new ConcreteHouseBuilderA();
House myHouse = HouseDirector.CreateHouse(myHouseBuilder);
System.out.println("My house has room: " + myHouse.getRoomNumber());
System.out.println("My house has door: " + myHouse.getDoorNumber());
}
}
什么是建造者模式
建造者模式是設(shè)計模式的一種,將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。建造者模式
實(shí)用范圍
1 當(dāng)創(chuàng)建復(fù)雜對象的算法應(yīng)該獨(dú)立于該對象的組成部分以及它們的裝配方式時。[1]
2 當(dāng)構(gòu)造過程必須允許被構(gòu)造的對象有不同表示時。
角色
在這樣的設(shè)計模式中,有以下幾個角色:
1 builder:為創(chuàng)建一個產(chǎn)品對象的各個部件指定抽象接口。
2 ConcreteBuilder:實(shí)現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個部件,定義并明確它所創(chuàng)建的表示,并 提供一個檢索產(chǎn)品的接口。
3 Director:構(gòu)造一個使用Builder接口的對象。
4 Product:表示被構(gòu)造的復(fù)雜對象。ConcreteBuilder創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產(chǎn)品的接口。
例子
Builder
public interface PersonBuilder {
void buildHead();
void buildBody();
void buildFoot();
Person buildPerson();
}
//具體建造工具
ConcreteBuilder
public class ManBuilder implements PersonBuilder {
Person person;
public ManBuilder() {
person = new Person();
}
public void buildbody() {
person.setBody("建造男人的身體");
}
public void buildFoot() {
person.setFoot("建造男人的腳");
}
public void buildHead() {
person.setHead("建造男人的頭");
}
public Person buildPerson() {
return person;
}
}
//建造者
Director
public class PersonDirector {
public Person constructPerson(PersonBuilder pb) {
pb.buildHead();
pb.buildBody();
pb.buildFoot();
return pb.buildPerson();
}
}
Product
public class Person {
private String head;
private String body;
private String foot;
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getFoot() {
return foot;
}
public void setFoot(String foot) {
this.foot = foot;
}
}
public class Man extends Person {
}
Test
public class Test{
public static void main(String[] args) {
PersonDirector pd = new PersonDirector();
Person person = pd.constructPerson(new ManBuilder());
System.out.println(person.getBody());
System.out.println(person.getFoot());
System.out.println(person.getHead());
}
}
result
建造男人的身體
建造男人的腳
建造男人的頭
擴(kuò)展
建造者模式在使用過程中可以演化出多種形式:
省略抽象建造者角色
如果系統(tǒng)中只需要一個具體的建造者的話,可以省略掉抽象建造者。這是代碼可能如下:
class FoodManager
{
private:
BuilderA * builder;
public:
FoodManager() {builder = new BuilderA();};
void Construct()
{
builder->BuildRiceNoodles();
builder->BuildDrink();
builder->BuildCoolDish();
}
};
省略指導(dǎo)者角色
在具體建造者只有一個的情況下,如果抽象建造者角色已經(jīng)被省略掉,那么還可以省略掉指導(dǎo)者角色,讓Builder自己扮演指導(dǎo)者和建造者雙重角色。這是代碼可能如下:
//builder
class Builder
{
private:
Food * food;
public:
Builder(){food = new Food();}
void BuildRiceNoodles() {//..};
void BuildCoolDish(){//..};
void BuildDrink(){//..};
Food * getFood(){return food;}
void Construct()
{
BuildRiceNoodles();
BuildCoolDish();
BuildDrink();
}
};
同時,客戶端也需要進(jìn)行相應(yīng)的調(diào)整,如下:
//client
int _tmain(int argc, _TCHAR* argv[])
{
Builder * builder = new Builder();
builder->Construct();
Food *food = builder->getFood();
food->show();
return 0;
}
C#中的StringBuilder就是這樣一個例子。
以上就是關(guān)于生成器模式相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
vi在線設(shè)計免費(fèi)(vi設(shè)計在線生成)
免費(fèi)文字設(shè)計(免費(fèi)文字設(shè)計圖片在線生成)