已造房子為例姿搜,建造者模式包括產(chǎn)品Product(房子)笤昨、設(shè)計(jì)者Designer撩嚼、包工頭WorkBuilder停士。
1.傳統(tǒng)的建造者模式
//1.產(chǎn)品類代表一個(gè)房子
public class Product(){
private String window;
private String door;
public setWindow(String window){
this.window = window;
}
public setDoor(String door){
this.door = door;
}
}
//2.抽象的建造類
public interface Builder{
void createWindow();
void createDoor();
Product generateProduct();
}
//3.具體的建造者包工頭
public class WorkBuilder implements Builder{
private Product product = new Product();
@Override
public void createWindow(){
product.setWindow("方形窗戶");
}
@Override
public void createDoor(){
product.setDoor("拱形門");
}
@Override
public Product generateProduct(){
return product;
}
}
//4.設(shè)計(jì)者設(shè)計(jì)房子
//設(shè)計(jì)者設(shè)計(jì)房子的窗戶和門
//實(shí)現(xiàn)門和窗戶是交給建造者
public class Designer{
public void design(Builder builder){
builder.createWindow();
builder.createDoor();
}
}
//5.客戶端調(diào)用
public class Client{
public static void main(String[] args){
//1.創(chuàng)建建造者
Builder worker = new WorkBuilder();
//2.創(chuàng)建設(shè)計(jì)者
Desinger designer = new Desinger();
//3.設(shè)計(jì)者設(shè)計(jì)產(chǎn)品
designer.design(worker);
//4.建造者生產(chǎn)產(chǎn)品
worker.generateProduct();
}
}
傳統(tǒng)的建造者模式,設(shè)計(jì)者持有建造者的引用完丽,建造者持有產(chǎn)品的引用恋技。
2.變種的建造者模式
刪除了設(shè)計(jì)者和抽象的建造者類,利用產(chǎn)品和建造者實(shí)現(xiàn)逻族。
//1.建造者
public class ProductBuilder{
//內(nèi)部類用于保存需要建造的產(chǎn)品參數(shù)
class ProductParams{
public string window;
public string door;
}
//參數(shù)實(shí)例
private ProductParams params ;
//建造者構(gòu)造方法蜻底,new一個(gè)params對(duì)象
public ProductBuilder(){
this.params = new ProductParams();
}
//建造者需要調(diào)用的方法對(duì)params進(jìn)行初始化
public ProductBuilder madeWindow(String window){
params.window = window;
return this;
}
public ProductBuilder madeDoor(String door){
params.door = door;
return this;
}
public Product builder(){
Product product = new Product();
product.apply(params);
return product;
}
}
//2.產(chǎn)品類
public class Product{
private String window;
private String door;
public void apply(ProductParams params){
this.window = params.window;
this.door = params.door;
}
}
//3.客戶端調(diào)用
public class Client{
public static void main(String[] args){
//1.創(chuàng)建建造者 鏈?zhǔn)秸{(diào)用
Builder worker = (new WorkBuilder()).madeWindow("方形窗戶").madeDoor("拱形門");
//2.生產(chǎn)產(chǎn)品
Product product = worker.builder()
}
}
變種的建造者模式優(yōu)點(diǎn):
1.對(duì)于Product沒有進(jìn)行set方法,不對(duì)外部暴露改變屬性的方法聘鳞。
2.通過內(nèi)部類保存產(chǎn)品的屬性值薄辅,外界通過鏈?zhǔn)秸{(diào)用。
建造者模式抠璃,都是由建造者本身來產(chǎn)生具體的產(chǎn)品站楚。