Java描述设计模式(06):建造者模式
一、生活場(chǎng)景
基于建造者模式,描述軟件開(kāi)發(fā)的流程。
1、代碼實(shí)現(xiàn)
/*** 基于建造者模式描述軟件開(kāi)發(fā)*/ public class C01_InScene {public static void main(String[] args) {BuilderSoft builderSoft = new SoftImpl () ;ProjectManager manager = new ProjectManager(builderSoft) ;manager.createSoft();} }/*** 手機(jī)軟件產(chǎn)品開(kāi)發(fā)*/ class MobileSoft {// 設(shè)計(jì)private String design ;// 架構(gòu)private String frame ;// 開(kāi)發(fā)private String develop ;// 上線private String online ;// 省略 GET SET 方法 } /*** 手機(jī)軟件流程抽象類(lèi)*/ abstract class BuilderSoft {// 前期工作public abstract void earlyWork () ;// 中期工作public abstract void midWork () ;// 后期工作public abstract void lateWork () ;// 手機(jī)軟件完成public abstract MobileSoft builderSoft () ; }/*** 手機(jī)軟件具體實(shí)現(xiàn)*/ class SoftImpl extends BuilderSoft {private MobileSoft mobileSoft = new MobileSoft();@Overridepublic void earlyWork() {System.out.println("軟件前期設(shè)計(jì)...");}@Overridepublic void midWork() {System.out.println("軟件中期架構(gòu)...");System.out.println("軟件中期開(kāi)發(fā)...");}@Overridepublic void lateWork() {System.out.println("軟件后期上線...");}@Overridepublic MobileSoft builderSoft() {return mobileSoft ;} } /*** 項(xiàng)目經(jīng)理:把控項(xiàng)目進(jìn)度*/ class ProjectManager {private BuilderSoft builderSoft ;ProjectManager (BuilderSoft builderSoft){this.builderSoft = builderSoft ;}// 統(tǒng)籌項(xiàng)目周期public void createSoft (){builderSoft.earlyWork();builderSoft.midWork();builderSoft.lateWork();// MobileSoft mobileSoft = builderSoft.builderSoft() ;// return mobileSoft ;} }2、代碼結(jié)構(gòu)圖
二、建造者模式
1、基礎(chǔ)概念
建造模式是對(duì)象的創(chuàng)建模式。建造模式可以將一個(gè)產(chǎn)品的內(nèi)部屬性描述與產(chǎn)品的生產(chǎn)過(guò)程分割,從而可以使一個(gè)建造過(guò)程生成具有不同的內(nèi)部表象的產(chǎn)品對(duì)象。也就是使用一個(gè)中介對(duì)象封裝一系列的對(duì)象交互,使其各個(gè)對(duì)象不需要顯示的相互調(diào)用,而且可以單獨(dú)的改變對(duì)象之間的交互。
2、核心角色
1)、抽象建造者(Builder)角色
給出一個(gè)抽象接口,以規(guī)范產(chǎn)品對(duì)象的各個(gè)組成成分的建造。模式中直接創(chuàng)建產(chǎn)品對(duì)象的是具體建造者角色。
2)、具體建造者(ConcreteBuilder)角色
完成的任務(wù)包括:1.實(shí)現(xiàn)抽象建造者Builder所聲明的接口,給出完成創(chuàng)建產(chǎn)品實(shí)例的操作。2.在建造完成后,提供產(chǎn)品的實(shí)例。
3)、導(dǎo)演者(Director)角色
擔(dān)任這個(gè)角色的類(lèi)調(diào)用具體建造者角色以創(chuàng)建產(chǎn)品對(duì)象。
4)、產(chǎn)品(Product)角色
產(chǎn)品便是建造的對(duì)象。一般來(lái)說(shuō),一個(gè)系統(tǒng)中會(huì)有多個(gè)產(chǎn)品類(lèi),而且這些產(chǎn)品類(lèi)并不一定有共同的接口,而完全可以是不相關(guān)聯(lián)的。
3、模式圖解
4、源碼實(shí)現(xiàn)
/*** 建造者模式代碼*/ public class C02_Builder {public static void main(String[] args) {Builder builder = new ConcreteBuilder();Director director = new Director(builder);director.construct();Product product = builder.builderProduct();System.out.println(product.getAct1());System.out.println(product.getAct2());} } /*** 產(chǎn)品類(lèi)*/ class Product {/*定義一些產(chǎn)品的操作*/private String act1;private String act2;public String getAct1() {return act1;}public void setAct1(String act1) {this.act1 = act1;}public String getAct2() {return act2;}public void setAct2(String act2) {this.act2 = act2;} } /*** Builder 抽象建造者類(lèi)*/ abstract class Builder{public abstract void builderact1();public abstract void builderact2();public abstract Product builderProduct(); } /*** 具體建造者類(lèi)*/ class ConcreteBuilder extends Builder{private Product product = new Product();@Overridepublic void builderact1() {product.setAct1("操作一:執(zhí)行...");}@Overridepublic void builderact2() {product.setAct2("操作二:執(zhí)行...");}@Overridepublic Product builderProduct() {return product;} } /*** Director 導(dǎo)演者類(lèi)*/ class Director{/*使用建造者抽象類(lèi)*/private Builder builder;Director(Builder builder){this.builder = builder;}/*負(fù)責(zé)調(diào)用各個(gè)建造方法*/public void construct(){builder.builderact1();builder.builderact2();} }三、實(shí)際應(yīng)用
1、JDK中應(yīng)用
分析
1)、Appendable定義多個(gè)append() 抽象方法,抽象建造者。
2)、AbstractStringBuilder實(shí)現(xiàn)Appendable接口,已經(jīng)作為了建造者,只是抽象類(lèi)無(wú)法實(shí)例化。
3)、StringBuilder繼承AbstractStringBuilder,即作為具體建造者,也作為指揮者。
2、Spring中應(yīng)用
源碼實(shí)現(xiàn)
// 系列方法 public BeanDefinitionBuilder setParentName(String parentName); public BeanDefinitionBuilder setFactoryMethod(String factoryMethod); public BeanDefinitionBuilder setFactoryMethodOnBean(String factoryMethod, String factoryBean); public BeanDefinitionBuilder addConstructorArgValue(@Nullable Object value); public BeanDefinitionBuilder addConstructorArgReference(String beanName); public BeanDefinitionBuilder addPropertyValue(String name, @Nullable Object value); // 構(gòu)建Bean public AbstractBeanDefinition getRawBeanDefinition() {return this.beanDefinition; } public AbstractBeanDefinition getBeanDefinition() {this.beanDefinition.validate();return this.beanDefinition; }上面兩處建造者模式的實(shí)際應(yīng)用,都有點(diǎn)形散而神不散的感覺(jué)。
四、優(yōu)缺點(diǎn)分析
- 優(yōu)點(diǎn):減少類(lèi)之間的相互依賴(lài),降低耦合度。
- 缺點(diǎn):ConcreateBuilder變得臃腫龐大,邏輯復(fù)雜。
五、源代碼地址
GitHub地址:知了一笑 https://github.com/cicadasmile 碼云地址:知了一笑 https://gitee.com/cicadasmile
總結(jié)
以上是生活随笔為你收集整理的Java描述设计模式(06):建造者模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: iOS 动画总结----UIView动画
- 下一篇: CSS权威指南(第三版)