java設計模式-建造者模式
文章目錄
- java設計模式-建造者模式
-
- 概念
- 例子一
- 方式二
- 與抽象工廠的比較
概念
- 建造者模式也屬于建立型模式,它提供了一種對象的最佳方式。
定義:将一個複雜對象的構造與它的表示分離,使得同樣的建構過程可以建立不同的表示
- 主要作用:在使用者不知道對象的建造過程和細節 的情況下就可以直接建立複雜的對象。
- 使用者隻需要給出指定複雜對象的類型和内容,建造者模式負責按順序建立對象(把内部的建造過程和細節隐藏起來)
- 例子 :
- 工廠(建造者模式)∶負責制造汽車(組裝過>程和細節在工廠内)
- 汽車購買者(使用者)︰你隻需要說出你需要的>型号((對象的類型和内容),然後直接購買就可以使用了(不需要知道汽車是怎麼組裝的(車輪、車門、>發動機、方向盤等等))
既然是建造者模式,那麼我們還是繼續造房吧,其實我也想不到更簡單的例子。假設造房簡化為如下步驟:
(1)地基
(2)鋼筋工程
(3)鋪電線
(4)粉刷;
如果 要蓋一座房子,首先要找一個建築公司或工程承包商(指揮者)。承包商指揮勞工(具體建造者)過來造房子(産品),最後驗收。
例子一
//抽象的建造者
public abstract class Builder {
abstract void BuilderA();//地基
abstract void BuilderB();//鋼筋水泥
abstract void BuilderC();//鋪電線
abstract void BuilderD();//粉刷
//完工:得到産品
abstract Product getProduct();
}
具體的勞工
//具體的勞工
public class Worker extends Builder{
private Product product;
public Worker(){
product=new Product();
}
@Override
void BuilderA() {
product.setBuilderA("地基");
System.out.println("地基建造完成");
}
@Override
void BuilderB() {
product.setBuilderB("鋼筋工程");
System.out.println("鋼筋工程完成");
}
@Override
void BuilderC() {
product.setBuilderC("浦電線");
System.out.println("浦電線完成");
}
@Override
void BuilderD() {
product.setBuilderD("粉刷");
System.out.println("粉刷完成");
}
//獲得産品
@Override
Product getProduct() {
return product;
}
}
産品:房子
public class Product {
private String BuilderA;
private String BuilderB;
private String BuilderC;
private String BuilderD;
// 略... set get方法
}
指揮者
//指揮:指揮建構工程 如何建構由他決定
public class Director {
//指揮勞工 按照順序建房子
public Product build(Builder builder){
builder.BuilderA();
builder.BuilderB();
builder.BuilderC();
builder.BuilderD();
return builder.getProduct();
}
}
測試
public static void main(String[] args) {
//指揮
Director director=new Director();
//指揮指揮勞工建立房子
Product build = director.build(new Worker());
//列印房子
System.out.println(build.toString());
}
方式二
實作零件無序裝配構造,這種方式使用更加靈法,更符合定義。内部有複雜對象的預設實作,使用時可以根據使用者需求自由定義更改内容,并且無需改變具體的構造方式。就可以生産出不同複雜産品
比如:麥當勞的套餐,服務員(具體建造者)可以随意搭配任意幾種産品(零件)組成一款套菱(産品),然後出售給客戶。比第一種方式少了指揮者,主要是因為第二種方式把指揮者交給使用者來操作,使得産品的建立更加簡單靈活。
建造者
//建造者
public abstract class Builder {
abstract Builder builderA(String msg);//漢堡
abstract Builder builderB(String msg);//可樂
abstract Builder builderC(String msg);//薯條
abstract Builder builderD(String msg);//甜點
abstract Product getProduct();
}
具體的實作構造者 服務員
//具體的建造者
public class Worker extends Builder{
private Product product;
//建造者建立産品
public Worker(){
product=new Product();
}
@Override
Builder builderA(String msg) {
product.setBuildA(msg);
return this;
}
@Override
Builder builderB(String msg) {
product.setBuildB(msg);
return this;
}
@Override
Builder builderC(String msg) {
product.setBuildC(msg);
return this;
}
@Override
Builder builderD(String msg) {
product.setBuildD(msg);
return this;
}
@Override
Product getProduct() {
return product;
}
}
具體的産品
//産品:套餐
public class Product {
//沒有設定就是預設的
private String BuildA="漢堡";
private String BuildB="可樂";
private String BuildC="薯條";
private String BuildD="甜點";
//...略一些setget方法
}
測試
public static void main(String[] args) {
//服務員
Worker worker=new Worker();
Product product = worker.getProduct();
//指揮者就是服務員 沒有設定值就是預設的
System.out.println(product.toString());
//建構的順序由客戶指揮 在原來的基礎上自由組合,如果不組合,就是預設的套餐
Product product1 = worker.builderA("漢堡包").builderC("全家桶").builderD("薯片")
.getProduct();
System.out.println(product1.toString());
}