Java運(yùn)用設(shè)計模式中的建造者模式構(gòu)建項目的實例解析
1.建造者模式概念
定義: 將一個復(fù)雜的對象構(gòu)建與其表示相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示;
核心 : 構(gòu)建與表示分離,同構(gòu)建不同表示
區(qū)別于 抽象工廠模式 :
(1)與抽象工廠模式 相似,因為它也可以創(chuàng)建復(fù)雜對象。主要的區(qū)別是建造者模式著重于 一步步構(gòu)造一個復(fù)雜對象,關(guān)注的是零件類型和裝配工藝的順序 。而抽象工廠模式著重于多個系列的產(chǎn)品對象(簡單的或是復(fù)雜的)。建造者模式在最后的一步返回產(chǎn)品,而對于抽象工廠來說,產(chǎn)品是立即返回的。
(2)在建造者模式里,有個指導(dǎo)者,由指導(dǎo)者來管理建造者,用戶是與指導(dǎo)者聯(lián)系的,指導(dǎo)者聯(lián)系建造者最后得到產(chǎn)品。即建造模式可以強(qiáng)制實行一種分步驟進(jìn)行的建造過程。
2.它的角色
(1)抽象建造者(Builder)角色:該角色 是用于規(guī)范產(chǎn)品的各個組成部分,并進(jìn)行抽象,一般獨(dú)立于應(yīng)用程序的邏輯。
(2)具體建造者( ConcreteBuilder )角色:
該角色實 現(xiàn)出抽象建造者中定義的所有方法,并且返回一個組建好的產(chǎn)品實例。
(3)產(chǎn)品( Product )角色:
該角色是建造中的復(fù)雜對象,一個系統(tǒng)中會有多于一個的產(chǎn)品類,這些產(chǎn)品并不一定有公共的接口,完全可以是不相關(guān)聯(lián)的。
(4)指導(dǎo)者(Director)角色:
該角色負(fù)責(zé)安排已有的模塊的順序,然后告訴建造者 Builder開始建造 。
3.實例
public interface Builder {
void buildPartA();
void buildPartB();
void buildPartC();
}
public class BuilderImpl implements Builder {
@Override
public void buildPartA() {
System.out.println("建造部件A");
}
@Override
public void buildPartB() {
System.out.println("建造部件B");
}
@Override
public void buildPartC() {
System.out.println("建造部件C");
}
}
public class BuilderImpl2 implements Builder {
@Override
public void buildPartA() {
System.out.println("建造部件AA");
}
@Override
public void buildPartB() {
System.out.println("建造部件BB");
}
@Override
public void buildPartC() {
System.out.println("建造部件CC");
}
}
/**
* 指揮者:指導(dǎo) 如何 建造
* 組合Builder
*/
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
/**
* 建造方法:定義了建造的流程
* 如果需要其他流程來實現(xiàn),再new一個指揮者Director就可
*/
public void construct() {
System.out.println("director 指揮 builder進(jìn)行建造");
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
}
}
public class Director2 {
private Builder builder;
public Director2(Builder builder) {
this.builder = builder;
}
/**
* 建造方法:定義了建造的流程
* 如果需要其他流程來實現(xiàn),再new一個指揮者Director就可
*/
public void construct() {
System.out.println("director2 指揮 builder進(jìn)行建造");
builder.buildPartB();
builder.buildPartC();
builder.buildPartA();
}
}
public class Test {
public static void main(String[] args) {
Builder builder = new BuilderImpl();
Director director = new Director(builder);
/*
* 同樣的構(gòu)建過程,不同的模塊(buildPartA、buildPartB、buildPartC)實現(xiàn), new一個builder的實現(xiàn)
* 不同的構(gòu)建過程,new 一個director
* 不同的構(gòu)建過程,不同的模塊實現(xiàn), new director,new builder
*/
director.construct();
System.out.println("");
Builder builder2 = new BuilderImpl2();
Director director2 = new Director(builder2);
director2.construct();
System.out.println("");
Builder builder3 = new BuilderImpl2();
Director2 director3 = new Director2(builder3);
director3.construct();
}
}
打?。?/p>
director 指揮 builder進(jìn)行建造 建造部件A 建造部件B 建造部件C director 指揮 builder進(jìn)行建造 建造部件AA 建造部件BB 建造部件CC director2 指揮 builder進(jìn)行建造 建造部件BB 建造部件CC 建造部件AA
4.優(yōu)缺點(diǎn)
(1)優(yōu)點(diǎn):
A.可以讓你改變產(chǎn)品的內(nèi)部表示。
B.封裝建筑和代表性的代碼。
C.提供超過施工工藝的步驟的控制。
(2)缺點(diǎn):
A.需要創(chuàng)造各種不同類型的產(chǎn)品單獨(dú)ConcreteBuilder。
5.使用場景:
(1)當(dāng)創(chuàng)建復(fù)雜對象的算法應(yīng)該獨(dú)立于該對象的組成部分以及它們的裝配方式時。
(2)當(dāng)構(gòu)造過程必須允許被構(gòu)造的對象有不同表示時( 相同的方法,不同的執(zhí)行順序,產(chǎn)生不同的結(jié)果時)。
相關(guān)文章
實例解析Json反序列化之ObjectMapper(自定義實現(xiàn)反序列化方法)
這篇文章主要介紹了實例解析Json反序列化之ObjectMapper,json自定義序列化的方法,需要的朋友可以了解下。2017-09-09
spring?boot自動裝配之@ComponentScan注解用法詳解
@ComponentScan的作用就是根據(jù)定義的掃描路徑,把符合掃描規(guī)則的類裝配到spring容器中,下面這篇文章主要給大家介紹了關(guān)于spring?boot自動裝配之@ComponentScan注解用法的相關(guān)資料,需要的朋友可以參考下2023-04-04
SpringBoot+Shiro學(xué)習(xí)之密碼加密和登錄失敗次數(shù)限制示例
本篇文章主要介紹了SpringBoot+Shiro學(xué)習(xí)之密碼加密和登錄失敗次數(shù)限制示例,可以限制登陸次數(shù),有興趣的同學(xué)可以了解一下。2017-03-03
Java并發(fā)編程 interrupt()方法示例詳解
interrrupt()方法可以用來打斷正在運(yùn)行的線程,也可以打斷sleep()、wait()、join()情況下的線程,但是這些情況下被打斷線程的打斷標(biāo)記不同,這篇文章主要介紹了Java并發(fā)編程 interrupt()方法示例詳解,需要的朋友可以參考下2023-06-06

