通过KFC例子分析建造者模式

Posted 国境之南时代

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过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

以上是关于通过KFC例子分析建造者模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式——建造者模式实例

4,建造者模式

建造者模式

设计模式之建造者模式

大话设计模式-建造者模式(大鸟和小菜java版)

C# 设计模式巩固笔记 - 建造者模式