六、通过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

posted @ 2017-09-27 11:18  国境之南时代  阅读(1689)  评论(0编辑  收藏  举报