六、通過KFC例子分析建造者模式


1 建造者模式?

  將一個復雜對象的構建和他的表示分離,使得同樣的構建過程可以創建不同的表示。

分析:

  • 復雜對象:指的要具體生產的產品。
  • 復雜對象的構建:指的指揮者指揮具體的構建者去構建產品。
  • 復雜對象的表示:指的生產出來的產品長啥樣。
  • 創建不同的表示:因為具體的創建者不同,所以創建出了不同的表示。

2 優缺點分析?

優點:

  1. 具體的建造者之間相互獨立,這樣更方便擴展。比如要增加一個新的產品,只需要增加一個新的構建者類就好了。
  2. 產品的創建過程(步驟,就是對應的具體構建者中的各個方法)清晰。

缺點:

  1. 如果產品的變化大(這個產品的部件時多時少),需要改進具體的創建類,代碼改動大,不易維護。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM