1 建造者模式?
將一個復雜對象的構建和他的表示分離,使得同樣的構建過程可以創建不同的表示。
分析:
- 復雜對象:指的要具體生產的產品。
- 復雜對象的構建:指的指揮者指揮具體的構建者去構建產品。
- 復雜對象的表示:指的生產出來的產品長啥樣。
- 創建不同的表示:因為具體的創建者不同,所以創建出了不同的表示。
2 優缺點分析?
優點:
- 具體的建造者之間相互獨立,這樣更方便擴展。比如要增加一個新的產品,只需要增加一個新的構建者類就好了。
- 產品的創建過程(步驟,就是對應的具體構建者中的各個方法)清晰。
缺點:
- 如果產品的變化大(這個產品的部件時多時少),需要改進具體的創建類,代碼改動大,不易維護。
3 demo(包含詳細注釋)
package com.biao.builder.againchange; import java.util.ArrayList; import java.util.List; /*客戶端入口函數*/ public class BuilderDemo { public static void main(String[] args) { MealBuilder builderA = new MealA(); MealBuilder builderB = new MealB(); Director director = new Director(); director.construct(builderA); Meal mealA = builderA.getMeal(); mealA.show(1); director.construct(builderB); Meal mealB = builderB.getMeal(); mealB.show(2); } } /*創建產品的抽象類,並且為所創建產品的各個部件抽象出接口(就是一個部件對應一個方法)*/ /*一般情況,對於建造者模式,該抽象類至少包含創建部件的方法和返回對象兩部分。*/ abstract class MealBuilder{ abstract void buildFood(); abstract void buildDrink(); abstract Meal getMeal(); } /*產品的具體創建類,此部分相互獨立,方便進行擴展,創建出各色各樣的產品*/ /*產品的具體創建類內部要維護一個產品,然后進行裝配(給產品添加所需要的零件)*/ class MealA extends MealBuilder{ private Meal meal = new Meal(); @Override void buildFood() { // TODO Auto-generated method stub meal.add("一盒薯條"); } @Override void buildDrink() { // TODO Auto-generated method stub meal.add("一杯咖啡"); } @Override Meal getMeal() { return meal; } } class MealB extends MealBuilder{ private Meal meal = new Meal(); @Override void buildFood() { // TODO Auto-generated method stub meal.add("一個漢堡"); } @Override void buildDrink() { // TODO Auto-generated method stub meal.add("一杯牛奶"); } @Override Meal getMeal() { return meal; } } /*實體類:通過具體的建造者去生產*/ class Meal{ List<String> parts = new ArrayList<String>(); public void add(String part){ parts.add(part); } /*產品展示方法*/ public void show(int builder){ System.out.println("通過建造者"+builder+"生產好的產品包括:"); for (String part : parts) { System.out.println(part); } } } /*指揮者(kfc服務員),指揮如何去做這個套餐。該類和產品分離,只和產品的建造者打交道,解耦,單一職責*/ class Director{ public void construct(MealBuilder builder){ builder.buildFood(); builder.buildDrink(); } }
本文參考:http://www.cnblogs.com/chenssy/p/3307787.html#commentform