fancydeepin
毋意,毋必,毋固,毋我。
BlogJava
首頁
新隨筆
聯(lián)系
聚合
管理
隨筆-126 評論-247 文章-5 trackbacks-0
java 建造者模式(Builder)
Builder 模式
——
建造者模式
(又譯成
生成器模式
)
的主要功能是構(gòu)建復(fù)雜的產(chǎn)品,它是將一個(gè)復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
舉個(gè)例子,打個(gè)生產(chǎn)電腦的比方,這里簡單一點(diǎn),假設(shè)生產(chǎn)電腦只需要 CUP、內(nèi)存和顯卡,現(xiàn)在需要生產(chǎn)宏基和戴爾兩個(gè)品牌的電腦,不用設(shè)計(jì)模式的實(shí)現(xiàn):
Acer.java
import
java.util.ArrayList;
import
java.util.List;
/**
* -----------------------------------------
* @描述 生產(chǎn)宏基筆記本電腦
* @作者 fancy
* @郵箱 fancydeepin@yeah.net
* @日期 2012-8-4 <p>
* -----------------------------------------
*/
public
class
Acer
{
protected
List
<
String
>
parts
=
new
ArrayList
<
String
>
();
//
生產(chǎn)CPU
public
void
createCPU()
{
parts.add(
"
CUP: Intel 酷睿i3 2350M
"
);
}
//
生產(chǎn)內(nèi)存
public
void
createMemory()
{
parts.add(
"
內(nèi)存: 4GB DDR3 1333MHz
"
);
}
//
生產(chǎn)顯卡
public
void
createDisplayCard()
{
parts.add(
"
顯卡: NVIDIA GeForce GT 520M
"
);
}
//
顯示產(chǎn)品信息
public
void
show()
{
System.out.print(
"
產(chǎn)品部件信息:
"
);
for
(String part : parts)
{
System.out.print(part
+
"
\t
"
);
}
}
}
Dell.java
import
java.util.ArrayList;
import
java.util.List;
/**
* -----------------------------------------
* @描述 生產(chǎn)戴爾筆記本電腦
* @作者 fancy
* @郵箱 fancydeepin@yeah.net
* @日期 2012-8-4 <p>
* -----------------------------------------
*/
public
class
Dell
{
protected
List
<
String
>
parts
=
new
ArrayList
<
String
>
();
//
生產(chǎn)CPU
public
void
createCPU()
{
parts.add(
"
CUP: Intel 酷睿i7 3612QM
"
);
}
//
生產(chǎn)內(nèi)存
public
void
createMemory()
{
parts.add(
"
內(nèi)存: 8GB DDR3 1600MHz
"
);
}
//
生產(chǎn)顯卡
public
void
createDisplayCard()
{
parts.add(
"
顯卡: NVIDIA GeForce GT 640M+I(xiàn)ntel GMA HD 4000
"
);
}
//
顯示產(chǎn)品信息
public
void
show()
{
System.out.print(
"
產(chǎn)品部件信息:
"
);
for
(String part : parts)
{
System.out.print(part
+
"
\t
"
);
}
}
}
Client.java
/**
* -----------------------------------------
* @描述 客戶端測試
* @作者 fancy
* @郵箱 fancydeepin@yeah.net
* @日期 2012-8-4 <p>
* -----------------------------------------
*/
public
class
Client
{
private
static
Acer acer
=
new
Acer();
private
static
Dell dell
=
new
Dell();
public
static
void
main(String[] args)
{
/**
* 宏基
*/
acer.createCPU();
acer.createMemory();
acer.createDisplayCard();
acer.show();
/**
************************************
*/
System.out.println();
/**
************************************
*/
/**
* 戴爾
*/
dell.createCPU();
dell.createMemory();
dell.createDisplayCard();
dell.show();
}
}
仔細(xì)觀察一下上面的實(shí)現(xiàn),不難發(fā)現(xiàn),不管是生產(chǎn)何種品牌的筆記本,在實(shí)現(xiàn)的時(shí)候,它們的步驟基本上都是一樣的,都是生產(chǎn)電腦相應(yīng)的部件并添加都電腦里面,在生產(chǎn)不同品牌電腦
的時(shí)候,都會重復(fù)處理這幾個(gè)步驟,但是明顯的是,這幾個(gè)步驟都是穩(wěn)定的或者說是一樣的,只是每個(gè)步驟的具體實(shí)現(xiàn)不一樣或者說是變化的,如果將這些變化的部分抽取出來,也就是
說如果將處理過程與具體的步驟的實(shí)現(xiàn)分離開來的話,這樣就能夠復(fù)用這些處理過程,而且這樣一來就能很容易的做到在不同品牌電腦之間切換生產(chǎn)。
使用 Builder 模式的實(shí)現(xiàn),如圖:
Product.java
package
pattern.builder;
import
java.util.ArrayList;
import
java.util.List;
/**
* -----------------------------------------
* @描述 抽象產(chǎn)品
* @作者 fancy
* @郵箱 fancydeepin@yeah.net
* @日期 2012-8-5 <p>
* -----------------------------------------
*/
public
abstract
class
Product
{
protected
List
<
String
>
parts
=
new
ArrayList
<
String
>
();
//
添加部件
public
void
add(String part)
{
parts.add(part);
}
//
顯示產(chǎn)品信息
public
void
show()
{
System.out.print(
"
產(chǎn)品部件信息:
"
);
for
(String part : parts)
{
System.out.print(part
+
"
\t
"
);
}
}
}
Acer.java
package
pattern.builder;
/**
* -----------------------------------------
* @描述 宏基筆記本
* @作者 fancy
* @郵箱 fancydeepin@yeah.net
* @日期 2012-8-5 <p>
* -----------------------------------------
*/
public
class
Acer
extends
Product
{
//
Do other things here
}
Dell.java
package
pattern.builder;
/**
* -----------------------------------------
* @描述 戴爾筆記本
* @作者 fancy
* @郵箱 fancydeepin@yeah.net
* @日期 2012-8-5 <p>
* -----------------------------------------
*/
public
class
Dell
extends
Product
{
//
Do other things here
}
Builder.java
package
pattern.builder;
/**
* -----------------------------------------
* @描述 抽象建造者
* @作者 fancy
* @郵箱 fancydeepin@yeah.net
* @日期 2012-8-5 <p>
* -----------------------------------------
*/
public
interface
Builder
{
//
CUP
public
void
buildCPU();
//
內(nèi)存
public
void
buildMemory();
//
顯卡
public
void
buildDisplayCard ();
//
最終產(chǎn)品
public
Product getFinalResult();
}
AcerBuilder.java
package
pattern.builder;
/**
* -----------------------------------------
* @描述 宏基筆記本建造者
* @作者 fancy
* @郵箱 fancydeepin@yeah.net
* @日期 2012-8-5 <p>
* -----------------------------------------
*/
public
class
AcerBuilder
implements
Builder
{
private
Product product
=
new
Acer();
@Override
public
void
buildCPU()
{
product.add(
"
CUP: Intel 酷睿i3 2350M
"
);
}
@Override
public
void
buildMemory()
{
product.add(
"
內(nèi)存: 4GB DDR3 1333MHz
"
);
}
@Override
public
void
buildDisplayCard()
{
product.add(
"
顯卡: NVIDIA GeForce GT 520M
"
);
}
@Override
public
Product getFinalResult()
{
return
product;
}
}
DellBuilder.java
package
pattern.builder;
/**
* -----------------------------------------
* @描述 戴爾筆記本建造者
* @作者 fancy
* @郵箱 fancydeepin@yeah.net
* @日期 2012-8-5 <p>
* -----------------------------------------
*/
public
class
DellBuilder
implements
Builder
{
private
Product product
=
new
Dell();
@Override
public
void
buildCPU()
{
product.add(
"
CUP: Intel 酷睿i7 3612QM
"
);
}
@Override
public
void
buildMemory()
{
product.add(
"
內(nèi)存: 8GB DDR3 1600MHz
"
);
}
@Override
public
void
buildDisplayCard()
{
product.add(
"
顯卡: NVIDIA GeForce GT 640M+I(xiàn)ntel GMA HD 4000
"
);
}
@Override
public
Product getFinalResult()
{
return
product;
}
}
Director.java
package
pattern.builder;
/**
* -----------------------------------------
* @描述 產(chǎn)品構(gòu)建指導(dǎo)者
* @作者 fancy
* @郵箱 fancydeepin@yeah.net
* @日期 2012-8-5 <p>
* -----------------------------------------
*/
public
class
Director
{
private
Builder builder;
public
Director(Builder builder)
{
this
.builder
=
builder;
}
public
void
construct()
{
builder.buildCPU();
builder.buildMemory();
builder.buildDisplayCard();
}
}
Client.java
package
pattern.builder;
/**
* -----------------------------------------
* @描述 客戶端測試
* @作者 fancy
* @郵箱 fancydeepin@yeah.net
* @日期 2012-8-5 <p>
* -----------------------------------------
*/
public
class
Client
{
private
static
Builder acerBuilder
=
new
AcerBuilder(),
dellBuilder
=
new
DellBuilder();
public
static
void
main(String[] args)
{
System.out.print(
"
宏基
"
);
Director director
=
new
Director(acerBuilder);
director.construct();
Product product
=
acerBuilder.getFinalResult();
product.show();
/**
************************************
*/
System.out.println();
/**
************************************
*/
System.out.print(
"
戴爾
"
);
director
=
new
Director(dellBuilder);
director.construct();
product
=
dellBuilder.getFinalResult();
product.show();
}
}
后臺輸出:
宏基產(chǎn)品部件信息:CUP: Intel 酷睿i3 2350M 內(nèi)存: 4GB DDR3 1333MHz 顯卡: NVIDIA GeForce GT 520M
戴爾產(chǎn)品部件信息:CUP: Intel 酷睿i7 3612QM 內(nèi)存: 8GB DDR3 1600MHz 顯卡: NVIDIA GeForce GT 640M+I(xiàn)ntel GMA HD
4000
在這里,Acer 類和 Dell 類是空的,如果是這種情況,那么它們可以省略掉,如果 Product 也不是最終想要的,那么它也可以被省略掉,最終剩下的就只有 Director、Builder、
和具體的 Bulider 實(shí)現(xiàn)類。
在這里,
Acer 類和 Dell 類是
有關(guān)系的兩個(gè)類,它們都是電腦的品牌之一,如果遇到兩個(gè)或多個(gè)沒有太多關(guān)系的類,假設(shè) Acer 類代表電腦,Dell 類代表汽車,很明顯,
Acer 類和
Dell 類就不應(yīng)該再有共同的父類,也就是這種情況下,Product 這個(gè)抽象類不存在了,這時(shí)候問題就來了,那么 Builder 接口的規(guī)定的 getFinalResult() 方法的返回值怎么確定呢??
如果它的返回值
類型是 Acer,那么 DellBuilder 類就會有問題,如果它的返回值類型是 Dell,那么 AcerBuilder 類就會有問題;
很明顯,這是由于類型不能正確匹配引起的,如果是這種情況,可以將 Product 設(shè)計(jì)成標(biāo)識接口(空接口,接口里面沒有規(guī)定任何行為方法),再讓這些沒有相互關(guān)系的具體產(chǎn)品類
都去實(shí)現(xiàn)這個(gè)接口,
那么 Builder 接口里面規(guī)定的 getFinalResult() 方法的返回值類型依然是 Product 類型,這樣一來問題就解決了。
posted on 2012-08-05 14:03
fancydeepin
閱讀(5849)
評論(4)
編輯
收藏
評論:
#
re: java 建造者模式(Builder) 2013-02-20 17:35 |
rexue
一看就懂,太好太詳細(xì)了
回復(fù)
更多評論
#
re: java 建造者模式(Builder) 2013-04-18 14:28 |
Willy
謝謝您!
回復(fù)
更多評論
#
re: java 建造者模式(Builder) 2013-10-11 10:58 |
經(jīng)典小笑話
看了幾篇相關(guān)的,終于第一篇讓我明白了。因?yàn)橛幸粋€(gè)"不用設(shè)計(jì)模式的實(shí)現(xiàn)",謝謝了,呵~
回復(fù)
更多評論
#
re: java 建造者模式(Builder)
2016-08-02 11:41 |
Nimo
多謝,講的很清楚
回復(fù)
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發(fā)表評論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
github
個(gè)人主頁
beanutil
jutil
jexcel
orc
隨筆分類
(8)
junit
maven(8)
隨筆檔案
(104)
2015年6月 (8)
2015年2月 (1)
2015年1月 (1)
2014年9月 (1)
2014年8月 (3)
2014年6月 (10)
2014年5月 (3)
2014年3月 (5)
2013年10月 (1)
2013年9月 (2)
2013年4月 (1)
2013年3月 (2)
2013年2月 (11)
2012年11月 (3)
2012年10月 (14)
2012年8月 (15)
2012年7月 (13)
2012年6月 (10)
最新隨筆
1.?maven 為測試環(huán)境、生產(chǎn)環(huán)境等不同環(huán)境打包
2.?maven 多模塊項(xiàng)目
3.?nexus 搭建 maven 私服
4.?maven 鏡像
5.?maven jetty 插件使用
6.?maven jdk 版本配置
7.?eclipse maven plugin 插件 安裝 和 配置
8.?maven 安裝
9.?ORCP : 從數(shù)據(jù)庫表到 java 對象生成的 eclipse 插件
10.?jexcel 讀寫EXCEL
11.?linux 系列
12.?spring mvc(2):請求地址映射(@RequestMapping)
13.?spring mvc(1):基礎(chǔ)入門
14.?Java 驗(yàn)證碼、二維碼
15.?GXT —— TreePanel 組件(一)
搜索
積分與排名
積分 - 1461358
排名 - 15
最新評論
1.?re: Maven 手動添加 JAR 包到本地倉庫[未登錄]
剛安裝好的maven,倉庫里沒有jar包,如何添加jar包呢?
--Firefly
2.?re: java 建造者模式(Builder)
多謝,講的很清楚
--Nimo
3.?re: Maven 手動添加 JAR 包到本地倉庫
很好很強(qiáng)大, 完美的解決了我的問題。。。
--klose
4.?re: eclipse maven plugin 插件 安裝 和 配置
@fancydeepin
鏈接還是失效了啊
--菜鳥一號
5.?re: Maven 手動添加 JAR 包到本地倉庫[未登錄]
@呼吸~
你好,請問,怎么設(shè)置代理呢?
--paul
閱讀排行榜
1.?eclipse maven plugin 插件 安裝 和 配置(325792)
2.?Maven 手動添加 JAR 包到本地倉庫(199723)
3.?Lombok 安裝、入門 - 消除冗長的 java 代碼(154841)
4.?java 異常捕捉 ( try catch finally ) 你真的掌握了嗎?(70174)
5.?maven jetty 插件使用(49084)
6.?JSP/Servlet 工作原理(43123)
7.?maven jdk 版本配置(40994)
8.?spring mvc(2):請求地址映射(@RequestMapping)(39571)
9.?二叉樹的深度優(yōu)先遍歷與廣度優(yōu)先遍歷 [ C++ 實(shí)現(xiàn) ](31255)
10.?maven 多模塊項(xiàng)目(27896)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 fancydeepin
主站蜘蛛池模板:
最好看的中文字幕2019免费
|
91av视频免费在线观看
|
亚洲深深色噜噜狠狠爱网站
|
久久国产免费观看精品3
|
亚洲欧美国产日韩av野草社区
|
夜色阁亚洲一区二区三区
|
色欲色香天天天综合网站免费
|
国产成人精品日本亚洲直接
|
亚洲国产精品无码久久久
|
国产小视频免费观看
|
久久精品免费视频观看
|
亚洲一区精彩视频
|
国产黄色一级毛片亚洲黄片大全
|
亚洲网站免费观看
|
一级人做人爰a全过程免费视频
|
亚洲欧洲在线播放
|
亚洲免费视频一区二区三区
|
免费A级毛片无码无遮挡内射
|
国产成人精品免费视频大全
|
国产成人精品日本亚洲专区6
|
国产aⅴ无码专区亚洲av麻豆
|
999国内精品永久免费观看
|
老司机午夜在线视频免费
|
国产性生大片免费观看性
|
三级网站免费观看
|
亚洲av永久中文无码精品综合
|
www在线观看免费视频
|
亚洲一区精彩视频
|
亚洲AV电影院在线观看
|
亚洲成人影院在线观看
|
91香蕉成人免费网站
|
国精产品一区一区三区免费视频
|
日韩成人精品日本亚洲
|
亚洲国产精品线观看不卡
|
亚洲av无码不卡
|
久久亚洲高清综合
|
亚洲?v女人的天堂在线观看
|
性xxxx视频播放免费
|
色片在线免费观看
|
在线看无码的免费网站
|
任你躁在线精品免费
|